Это анти-шаблон для использования async/await внутри нового конструктора Promise()?
Я использую функцию async.eachLimit
для управления максимальным количеством операций за раз.
const { eachLimit } = require("async");
function myFunction() {
return new Promise(async (resolve, reject) => {
eachLimit((await getAsyncArray), 500, (item, callback) => {
// do other things that use native promises.
}, (error) => {
if (error) return reject(error);
// resolve here passing the next value.
});
});
}
Как вы можете видеть, я не могу объявить функцию myFunction
как async, потому что у меня нет доступа к значению во втором обратном вызове функции eachLimit
.
Ответы
Ответ 1
Вы эффективно используете promises внутри функции исполнителя конструктора обещаний, поэтому это анти-шаблон шаблона Promise.
Ваш код является хорошим примером основного риска: безопасно не распространяйте все ошибки. Читайте, почему там.
Кроме того, использование async
/await
может сделать еще одни сюрпризы. Для сравнения:
let p = new Promise(resolve => {
""(); // TypeError
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e)); // Catches it.