如何将.map()与promise相结合?

时间:2018-02-14 20:04:16

标签: javascript promise es6-promise map-function

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

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

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

我期望对第一个元素(ap进行调用,并在解析后将结果添加到a(给予ax)。与b相同。

最终我期待一个新阵列['ax', 'bx']

我获得的是一系列Promises

对Promises很新(我在理论上发现很棒)我很难理解这里出了什么问题。 是否可以将.map()和异步操作合并在一起?

2 个答案:

答案 0 :(得分:4)

  

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

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

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

答案 1 :(得分:-1)

编辑:这是一个按照您希望的方式运行的代码:

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:你可以重构代码,在我的国家有点太晚,所以现在就去睡觉。