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