如何将 .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)
我有一个数组,对于这个数组的每个元素,我需要 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)