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
/ await
moż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) async
odpowiednikiem:
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 .then
jesteś sam).
Drugi nie działa, ponieważ każdy natychmiastowy wyjątek w async
funkcji odrzuca niejawną obietnicę zwróconą przez async
samą 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ć myFunction
jako 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
?