Ви ефективно використовуєте обіцянки всередині функції виконавця конструктора обіцянок, тому це анти-шаблон Promise constructor .
Ваш код є хорошим прикладом основного ризику: не безпечно поширювати всі помилки. Прочитайте, чому там .
Крім того, використання async
/ await
може зробити ті самі пастки ще більш дивовижними. Порівняйте:
let p = new Promise(resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
з наївним (неправильним) async
еквівалентом:
let p = new Promise(async resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
Шукайте останню на веб-консолі веб-переглядача.
Перший працює, оскільки будь-яке негайне виняток у функції виконавця конструктора Promise зручно відкидає нещодавно побудовану обіцянку (але всередині будь-якого .then
ви самі).
Другий не працює, оскільки будь-який негайний виняток у async
функції відхиляє неявне обіцянку, повернене самою async
функцією .
Оскільки повертане значення функції-виконавця обіцянки не використовується, це погана новина!
Ваш код
Немає жодної причини, яку ви не можете визначити myFunction
як async
:
async function myFunction() {
let array = await getAsyncArray();
return new Promise((resolve, reject) => {
eachLimit(array, 500, (item, callback) => {
}, error => {
if (error) return reject(error);
});
});
}
Хоча навіщо використовувати застарілі бібліотеки контролю паралельності, коли вони є await
?