#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
библиотеки, я не измерял, но обещания выполняются достаточно быстро, чтобы не беспокоиться о преждевременной оптимизации.