Вы эффективно используете обещания внутри функции-исполнителя конструктора обещаний, поэтому это анти-шаблон конструктора обещаний .
Ваш код является хорошим примером основного риска: небезопасного распространения всех ошибок. Почитай почему там .
Кроме того, использование 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
?