Filtrage d'un tableau avec une fonction qui renvoie une promesse

Donné

let arr = [1,2,3];

function filter(num) {
  return new Promise((res, rej) => {
    setTimeout(() => {
      if( num === 3 ) {
        res(num);
      } else {
        rej();
      }
    }, 1);
  });
 }

 function filterNums() {
   return Promise.all(arr.filter(filter));
 }

 filterNums().then(results => {
   let l = results.length;
   //length should be 1, but is 3
 });

La longueur est 3, car les Promesses sont retournés, et non des valeurs. Est-il un moyen de filtrer le tableau avec une fonction qui renvoie une Promesse?

Remarque: Pour cet exemple, fs.stat a été remplacé avec setTimeout, voir https://github.com/silenceisgolden/learn-esnext/blob/array-filter-async-function/tutorials/array-filter-with-async-function.js pour le code spécifique.

"Est-il un moyen de filtrer le tableau avec une fonction qui renvoie une Promesse?" Certainement pas avec l'aide de Array#filter.
C'est ce que je suis finales en tant que bien, mais pouvez-vous en expliquer la raison derrière cela? Je ne suis pas à comprendre pourquoi c'est le cas; il ne semble pas semi-logique pour moi.
parce que le filtre s'attend à une fonction qui retourne un booléen, pas une promesse objet
Oui, je le comprends. La modification de la fonction de filtre pour une fonction async produit les mêmes résultats, donc je suppose que renvoie également une promesse au lieu de l'attendre en attente pour le retour booléen.

OriginalL'auteur ajklein | 2015-10-26