我有一个数组,对于这个数组的每个元素,我需要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)
我期望对第一个元素(a
)p
进行调用,并在解析后将结果添加到a
(给予ax
)。与b
相同。
最终我期待一个新阵列['ax', 'bx']
。
我获得的是一系列Promises
对Promises很新(我在理论上发现很棒)我很难理解这里出了什么问题。 是否可以将.map()
和异步操作合并在一起?
答案 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:你可以重构代码,在我的国家有点太晚,所以现在就去睡觉。