【问题标题】:How to combine a .map() with a promise? [duplicate]如何将 .map() 与承诺结合起来? [复制]
【发布时间】:2018-02-14 20:04:15
【问题描述】:

我有一个数组,对于这个数组的每个元素,我需要 fetch 一些数据(取决于元素)并将这些数据添加到数组中的元素。

举个例子,我将用 Promise 模拟fetch(在现实生活中,这将是一个网络服务的答案):

let p = new Promise((resolve, reject) => resolve('x'))
let a = ['a', 'b']
a = a.map(x => p.then(y => x + y))
console.log(a)

我期望第一个元素 (a) p 被调用,并在解决后将结果添加到 a(给出 ax)。 b 也一样。

最终我期待一个新数组['ax', 'bx']

我得到的是一组 Promises

对 Promises 很陌生(我觉得理论上很棒)我很难理解这里出了什么问题。 是否可以将.map() 和异步操作结合在其中?

【问题讨论】:

标签: javascript promise es6-promise map-function


【解决方案1】:

我期待一个新数组 ['ax', 'bx'],但我得到的是一个 Promises 数组

这正是Promise.all 的用途。当然,它不会产生一个普通的数组,而是一个对它的承诺,但是当你做任何异步的事情时,你无法避免这种情况。

const promises = a.map(x => p.then(y => x + y))
Promise.all(promises).then(console.log, console.error)

【讨论】:

  • 酷 - 虽然缺少 .catch 语句
  • 虽然赞成 :) 看起来很干净
  • @DrNio 你的意思是每个承诺链都应该以错误处理程序结束?已添加。
  • 就是这样,谢谢。它还与 KevinB 评论中的“相关”链接相匹配(我将自己标记为重复)
  • 你为什么会在这样一个微不足道的例子中关心这些事情?
【解决方案2】:

编辑:这是一个可以按照您希望的方式工作的代码:

let p = new Promise((resolve, reject) => resolve('x'))
let a = ['a', 'b']
let c =[]
Promise.resolve(a.map(x => p.then(y => c.push(x + y)))).then(() => console.log(c))

由于 p.then 返回一个空对象,您的地图将返回一个空对象数组。

PS:你可以重构代码,在我的国家有点太晚了,所以现在就去睡觉了。

【讨论】:

  • 举个例子就好了
  • 编辑了原始答案@DrNio
  • 酷 - 我也会添加一个 .catch 。我不知道为什么它被否决 - 也许那个人可以解释为什么。
  • @DrNio 它被否决了,因为它不起作用p 有一个超时(而不是立即解决),它就会崩溃。
  • 好的,感谢您的关注!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
相关资源
最近更新 更多