Filtern von einem array mit einer Funktion, die eine Zusage zurückgibt
Gegeben
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
});
Die Länge ist 3, weil die Versprechungen sind zurückgekehrt, nicht um Werte. Gibt es eine Möglichkeit, filter-array mit einer Funktion, die eine Zusage zurückgibt?
Hinweis: Für dieses Beispiel, fs.stat wurde ersetzt mit setTimeout finden Sie https://github.com/silenceisgolden/learn-esnext/blob/array-filter-async-function/tutorials/array-filter-with-async-function.js für den spezifischen code.
InformationsquelleAutor der Frage ajklein | 2015-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits erwähnt in den Kommentaren,
Array.prototype.filter
ist synchron und unterstützt daher keine Versprechungen.Da kann man jetzt (theoretisch) Unterklasse built-in-Typen mit ES6, Sie sollten in der Lage sein, um Ihre eigenen asynchrone Methode, welche umschließt die vorhandenen filter-Funktion:
Hinweis: ich habe auskommentiert, die Unterklassen, da es nicht unterstützt wird von Babel nur noch für Arrays
Babel REPL Demo
InformationsquelleAutor der Antwort CodingIntrigue
Versprechen Reducer, um die Rettung!
Reduzierstücke sind genial. "Reduzieren, mein problem ist mein Ziel" scheint eine ziemlich gute Strategie, für alles, was komplexer als das, was die einfachen Werkzeuge werden für Sie zu lösen, d.h. die Filterung eines array von Dinge, die sind nicht alle sofort verfügbar.
InformationsquelleAutor der Antwort Dan Ross
Spät, um das Spiel, aber da sonst niemand Sie erwähnt, Bluebird unterstützt Versprechen.Karte, die ist mein go-to für Filter erfordern aysnc Verarbeitung für den Zustand,
InformationsquelleAutor der Antwort Spencer MacBeth
Einen gültigen Weg, dies zu tun (aber es scheint zu unordentlich):
Wieder, scheint Weg zu chaotisch.
InformationsquelleAutor der Antwort ajklein
Variante von @DanRoss:
Beachten Sie, dass, wenn (wie im aktuellen Fall), müssen Sie nicht sorgen zu machen über die filter() having
Nebenwirkungen, die serialisiert werden müssen, können Sie auch tun:
InformationsquelleAutor der Antwort shaunc