Это анти-шаблон для использования 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.