В чем разница между async.map из библиотеки async и Promise.map из bluebird?

#javascript #node.js #async-await #bluebird #async.js

#javascript #node.js #async-ожидание #bluebird #async.js

Вопрос:

Я объясняю сам:

Что я хочу сделать, так это использовать async / await с одной из этих библиотек (async или bluebird).

Я не понимаю, почему это хорошо работает:

 const promises = Promise.map (someArray, async item => {                
      const result = await getSomething(item);
      return {...item, ...result}
});

const promisesResults = await Promise.all(promises);
  

Но то же самое с async.map не так. Это возвращает меня undefined .

Спасибо всем!

Комментарии:

1. Но то же самое с async.map не так. — это не может быть одним и тем же, потому что это другая библиотека. Какой именно код вы пробуете?

2. const promises = async.map (someArray, async item => { const result = await getSomething(item); return {...item, ...interview} });

Ответ №1:

async это устаревшая библиотека, которая решала те же проблемы, что и promises, до распространения шаблона promise и появления собственных promises. async библиотека основана на обратном вызове и не знает об обещаниях и async функциях, которые являются синтаксическим сахаром для обещаний ES6.

Фрагмент работает, потому что Promise.all ожидает массив обещаний:

 Promise.all(promises);
  

И массив обещаний предоставляется с помощью array map с async обратным вызовом функции:

 someArray.map(async item => { ... })
  

Это не будет работать с async библиотекой, потому что предполагается, что она работает с функцией iteratee на основе обратного вызова и не знает об обещаниях, которые async возвращает функция.

Поскольку в обещаниях ES6 отсутствуют некоторые расширенные функции из async библиотеки, их можно дополнить с помощью Bluebird API или promise ponyfills.

Комментарии:

1. Я понимаю! Итак, если я хочу использовать async / await и Promise. в конце концов, лучше использовать библиотеку bluebird, верно?

2. Да, вам не нужна async библиотека при работе с promises. Возможно, Bluebird вам тоже не понадобится, если Promise.all это все, что вам нужно. someArray.map код, который вы изначально опубликовали, будет работать только с обещаниями ES6. Вы можете взглянуть на понызаполнения promise, которые предлагают большинство функций, которые Bluebird делает, чтобы не зависеть от всей библиотеки Bluebird.

3. Я много использую javascript Promise.all в своем проекте, и я прочитал, что, чтобы избежать создания массива обещаний каждый раз, я могу легко использовать `Promise.map` из bluebird. Я собираюсь взглянуть на ponyfills . И скажите мне, что насчет производительности? асинхронный или bluebird?

4. Если вам не нужна временная переменная, вы можете пропустить ее, это так просто, как Promise.all(someArray.map(async item => ... )) . Чистая цепочка обещаний Bluebird быстрее, чем чистая цепочка собственных обещаний (может измениться в будущем), но большинство улучшений производительности отбрасываются, поскольку async в любом случае используются собственные обещания. Я бы сказал, что производительность не является причиной для выбора Bluebird здесь. Что касается async библиотеки, я не измерял, но обещания выполняются достаточно быстро, чтобы не беспокоиться о преждевременной оптимизации.