Sie verwenden Versprechen effektiv innerhalb der Executor-Konstruktor-Executor-Funktion, also das Anti-Muster des Promise-Konstruktors .
Ihr Code ist ein gutes Beispiel für das Hauptrisiko: Nicht alle Fehler sicher zu verbreiten. Lesen Sie warum dort .
Darüber hinaus kann die Verwendung von async/ awaitdie gleichen Fallen noch überraschender machen. Vergleichen Sie:
let p = new Promise(resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
mit einem naiven (falschen) asyncÄquivalent:
let p = new Promise(async resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
Suchen Sie in der Webkonsole Ihres Browsers nach der letzten.
Die erste funktioniert, weil jede unmittelbare Ausnahme in einer Promise-Konstruktor-Executor-Funktion das neu erstellte Versprechen bequem ablehnt (aber in jeder, die .thenSie alleine sind).
Die zweite Funktion funktioniert nicht, da jede unmittelbare Ausnahme in einer asyncFunktion das implizite Versprechenasync ablehnt, das von der Funktion selbst zurückgegeben wird .
Da der Rückgabewert einer Versprechen-Konstruktor-Executor-Funktion nicht verwendet wird, sind das schlechte Nachrichten!
Dein Code
Es gibt keinen Grund, den Sie nicht definieren können myFunctionals async:
async function myFunction() {
let array = await getAsyncArray();
return new Promise((resolve, reject) => {
eachLimit(array, 500, (item, callback) => {
}, error => {
if (error) return reject(error);
});
});
}
Aber warum sollten Sie veraltete Parallelitätskontrollbibliotheken verwenden, wenn Sie haben await?