ES6 Promises - so etwas wie async.jeder?
Bild zu versuchen-heraus, wie um etwas zu finden, die funktional genau wie async.eachSeries, ich brauche eine Liste von asynchronen Aktionen nacheinander ablaufen (nicht parallel), aber kann nicht einen Weg finden, es zu tun im einheitlichen ES6, kann mir jemand raten, bitte?
p.s. Gedanken über Generatoren/yield, haben aber nicht die Erfahrung, aber ich bin mir nicht klar, wie genau Sie mir helfen können.
Bearbeiten 1
pro Anfrage, hier ein Beispiel:
Ausgehen, dass sich dieser code:
let model1 = new MongooseModel({prop1: "a", prop2: "b"});
let model2 = new MongooseModel({prop1: "c", prop2: "d"});
let arr = [model1 , model2];
Nun, ich will laufen über Sie in einer Reihe, nicht parallel, also mit der "async" - NPM ist es ganz einfach:
async.eachSeries(arr, (model, next)=>{
model.save.then(next).catch(next);
}, err=>{
if(err) return reject(error);
resolve();
})
Meine Frage ist: mit ES6, kann ich es nativ? ohne die NPM 'async' - Paket?
Edit 2
Mit async/await-es kann leicht gemacht werden:
let model1 = new MongooseModel({prop1: "a", prop2: "b"});
let model2 = new MongooseModel({prop1: "c", prop2: "d"});
let arr = [model1 , model2];
for(let model of arr){
await model.save();
}
- Du meinst, die zweite Funktion hängt vom Ergebnis der ersten Funktion?
- Es ist nicht, muss es abhängen, sondern muss ausgeführt werden, nachdem der Vorherige getan hat.
- Sie sollten ein Beispiel geben und den sample-input und erwarteten output, um das problem zu erklären richtig.
- Zugegeben ein Beispiel, danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für diejenigen, die gerne kurze Antworten:
Promise.resolve().then(func1).then(func2)
..then(resultFromFunc2 => console.log("all done"))
am Ende, bevor;
.Promise.all([func1, func2]);
.Lassen Sie uns sagen Sie, dass Sie möchten, um eine async-Funktion auf ein array von Daten, und Sie wollen, dass Sie genannt sequentiell, nicht parallel.
Schnittstelle für
async.eachSeries()
ist wie folgt:Hier ist, wie um zu simulieren, dass mit dem Versprechen:
Dies setzt Voraus, dass
iteratorFn
nimmt die Sache zu verarbeiten, wie ein argument und es gibt ein Versprechen.Hier ein Verwendungs-Beispiel (vorausgesetzt, dass Sie eine promisified
fs.readFileAsync()
) und haben eine Funktion namensspeak()
, die eine Zusage zurückgibt, wenn Sie fertig:Diese können das Versprechen, Infrastruktur-Sequenz, die alles für Sie.
Ist es auch möglich für Sie, um die Sequenz, die Dinge manuell (obwohl ich nicht sicher bin, warum):
Oder eine einfachere version, die manuell Ketten der verspricht zusammen:
Beachten Sie, wie einer der manual-Versionen hat zu umgeben
iteratorFn()
mittry/catch
um sicherzustellen, dass es ist, werfen-sicher (konvertieren Ausnahmen in einer Ablehnung)..then()
automatisch werfen-sicher, so dass die anderen Systeme nicht haben, um manuell abfangen von Ausnahmen, da.then()
schon fängt Sie für Sie.array.reduce()
zum Durchlaufen des Arrays und verwendet verspricht Kette zusammen, alle Vorgänge.EachSeries
Funktion, rufen SiePromise.resolve());
ohne AngabePromise
überall. Auch, was sind diep, item
ausarray.reduce?
Promise.resolve()
ist die Herstellung, der Ausgangswert. Die callback übergeben Sie dann mit zwei Argumenten aufgerufen. Das erste argument der aktuelle Wert in der Reduktion. Ich habe benannt, dassp
in meinem code, und es ist der erste Wert derPromise.resolve()
. Nachfolgende Werte wird der Rückgabewert von meinen Rückrufreturn p.then(...)
was andere Versprechen. Das zweite argument an den callback ist der nächste Wert in dem array, das wir reduzieren..reduce()
. Sie nennen es wie folgt:var reducedValue = array.reduce(fn, initialValue)
. MeinePromise.resolve()
ist, dassinitialValue
. Es ist nur ein Weg, um ein Versprechen Kette initialisieren, um ein bereits gelöst Versprechen. Es ist wie eine ArtPromise.resolve().then(fn1).then(fn2).then(fn3)
.async
undawait
im ES7 so sind Sie die Zukunft der Sprache zu. Wenn ich wollte, um die Sequenz durch eine Reihe asynchron, ich würde so etwas wiePromise.mapSeries()
im Bluebird Versprechen-Bibliothek ist die Bibliothek, die ich verwenden in der Regel zum hinzufügen von erweiterten Fähigkeiten Versprechen.return
Aussagen zu tun. Es scheint wie eine Menge, wie ich bin immer noch versuchen, wickeln Sie meinen Kopf herum alle von Ihnen.Als eine Erweiterung der Antwort von @jib... man kann auch die Karte eine Reihe von Elementen, um asynchrone Funktionen wie:
Bemerken, wie
prev_result
wird der Wert zurückgegeben, der durch die bisherige Auswertung dersomething_async
dies entspricht etwa einem hybrid zwischenasync.eachSeries
undasync.waterfall
.Können Sie die Kette von der Rückkehr in die
then
Rückruf. Zum Beispiel:Drucken:
Diese natürlich Arbeit, wenn asynchron Lösung verspricht:
Druck:
then
tut, ist die Rückkehr ein Versprechen, übergeben Sie Rückrufe und erstellen Sie verspricht, wie gebraucht.//Hochladen dies für Systeme, die laufen tiefer nodejs-version (Azure :/)
Nicht die kürzeste aber die schönste die ich mir denken kann
zum Beispiel können sagen, "functionWithPromise" gibt einige Versprechen, und erwartet, dass einige Artikel.