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
/ await
die 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 .then
Sie alleine sind).
Die zweite Funktion funktioniert nicht, da jede unmittelbare Ausnahme in einer async
Funktion 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 myFunction
als 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
?