Efektywnie korzystasz z obietnic wewnątrz funkcji wykonawczej konstruktora obietnicy, więc jest to wzorzec anty-wzorca konstruktora Promise .
Twój kod jest dobrym przykładem głównego ryzyka: nie propaguje bezpiecznie wszystkich błędów. Przeczytaj, dlaczego tam .
Ponadto użycie async/ awaitmoże sprawić, że te same pułapki będą jeszcze bardziej zaskakujące. Porównać:
let p = new Promise(resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
z naiwnym (złym) asyncodpowiednikiem:
let p = new Promise(async resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
Poszukaj ostatniego w konsoli internetowej przeglądarki.
Pierwsza z nich działa, ponieważ każdy natychmiastowy wyjątek w funkcji wykonawczej konstruktora Promise wygodnie odrzuca nowo skonstruowaną obietnicę (ale wewnątrz każdej .thenjesteś sam).
Drugi nie działa, ponieważ każdy natychmiastowy wyjątek w asyncfunkcji odrzuca niejawną obietnicę zwróconą przez asyncsamą funkcję .
Ponieważ wartość zwracana funkcji wykonawcy konstruktora obietnicy nie jest używana, to zła wiadomość!
Twój kod
Nie ma powodu, dla którego nie możesz zdefiniować myFunctionjako async:
async function myFunction() {
let array = await getAsyncArray();
return new Promise((resolve, reject) => {
eachLimit(array, 500, (item, callback) => {
}, error => {
if (error) return reject(error);
});
});
}
Chociaż po co używać przestarzałych bibliotek kontrolnych współbieżności, skoro tak jest await?