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
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.
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
Vous devez vous connecter pour publier un commentaire.
Comme mentionné dans les commentaires,
Array.prototype.filter
est synchrone et par conséquent ne prend pas en charge les Promesses.Puisque l'on peut (théoriquement) la sous-classe des types intégrés avec ES6, vous devriez être en mesure d'ajouter votre propre méthode asynchrone qui enveloppe du filtre existant de la fonction:
Note: j'ai commenté le sous-classement, car il n'est pas pris en charge par Babel juste encore pour les Tableaux
Babel REPL Démo
super()
doit être appelée avant toute affectation àthis
à l'intérieur deconstructor
La mise en œuvre de la sous-classe était juste un exemple. Vous n'auriez pas besoin d'un constructeur avec de vrais sous-classement, que vous seriez à l'aide de la base de la Matrice de constructeur et non pas à l'aide de votre propre magasin de données
Vous avez raison, je viens d'avertissement pour les gens qui, à l'aveuglette "copier-coller" les accepté de répondre 🙂
Ah bon point, il ne ressemble vous pouvez supprimer simplement les commentaires de ce bloc et de le faire travailler...
OriginalL'auteur CodingIntrigue
Promesse Réducteur à la rescousse!
Réducteurs sont impressionnantes. "Réduire mon problème à mon but" semble être une très bonne stratégie pour quelque chose de plus complexe que ce que les outils simples permettra de résoudre pour vous, c'est à dire le filtrage d'un tableau de choses qui ne sont pas tous disponibles immédiatement.
OriginalL'auteur Dan Ross
Tard pour le jeu, mais puisque personne d'autre mention, Bluebird prend en charge Promesse.la carte qui est mon go-to pour les filtres nécessitant aysnc de traitement pour la condition,
OriginalL'auteur Spencer MacBeth
Un moyen valable de le faire (mais il semble trop salissant):
De nouveau, semble trop salissant.
async
/await
mots-clés sont ES7 (Candidat) pas ES6OriginalL'auteur ajklein
Une variante de @DanRoss:
Remarque que si (comme dans le cas actuel), vous n'avez pas à vous soucier de filtre() ayant
effets secondaires qui doivent être sérialisé, vous pouvez également le faire:
OriginalL'auteur shaunc
Pour tapuscrit folk (ou es6 juste supprimer le type syntaxe)
es6
OriginalL'auteur William Lohan