如何将 .map() 与承诺结合起来?

How to combine a .map() with a promise?

我有一个数组,对于这个数组的每个元素,我需要 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() 和异步操作?

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

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 return 是一个空对象,您的地图将 return 一个空对象数组。

PS:你可以重构代码,国内有点晚了,先睡觉了。

I expected a new array ['ax', 'bx'], but what I get instead is an array of Promises

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

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