【问题标题】:What is the difference between async.map from async library and Promise.map from bluebird?来自异步库的 async.map 和来自 bluebird 的 Promise.map 有什么区别?
【发布时间】:2019-07-29 08:42:31
【问题描述】:

我自己解释一下:

我想要做的是将 async/await 与其中一个库(异步或蓝鸟)一起使用。

我不明白为什么这很好用:

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

const promisesResults = await Promise.all(promises);

但是 async.map 不是这样。它返回给我undefined

谢谢大家!

【问题讨论】:

  • 但与 async.map 不同。 - 它不可能相同,因为它是不同的库。你到底在尝试什么代码?
  • const promises = async.map (someArray, async item => { const result = await getSomething(item); return {...item, ...interview} });

标签: javascript node.js async-await bluebird async.js


【解决方案1】:

async 是遗留库,在 Promise 模式传播和原生 Promise 出现之前解决了与 Promise 相同的问题。 async library 是基于回调的,不知道 Promise 和 async functions,它们是 ES6 Promise 的语法糖。

sn-p 有效,因为Promise.all 需要一组承诺:

Promise.all(promises);

并且数组mapasync函数回调提供了一组promise:

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

这不适用于 async 库,因为它应该适用于基于回调的 iteratee 函数,并且不知道 async 函数返回的承诺。

由于 ES6 Promise 缺少来自 async 库的一些高级特性,它们可以通过 Bluebird API 或 promise ponyfills 进行扩充。

【讨论】:

  • 我明白了!所以如果我想使用 async/await 和 Promise.all 最好使用 bluebird 库对吗?
  • 是的,当您使用 Promise 时,您不需要 async lib。如果您只需要 Promise.all,您可能也不需要 Bluebird。 someArray.map 您最初发布的代码仅适用于 ES6 承诺。你可以看看 Promise ponyfills,它提供了 Bluebird 所做的大多数事情,而不依赖于整个 Bluebird 库。
  • 我在我的项目中使用了很多 Promise.all,我阅读了这些内容以避免每次我可以轻松地使用 bluebird 的 Promise.map 时创建一系列承诺。我要看看ponyfills。告诉我性能怎么样?异步还是蓝鸟?
  • 如果你不需要临时变量你可以跳过它,就像Promise.all(someArray.map(async item => ... ))一样简单。纯 Bluebird 承诺链比纯原生承诺链更快(将来可能会改变),但大多数性能改进都被丢弃了,因为 async 以任何方式使用原生承诺。我想说性能不是在这里选择 Bluebird 的理由。至于async 库,我没有测量,但 Promise 足够快,不会为过早优化而烦恼。
猜你喜欢
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多