我有以下数据结构:
[
{
"id": 1,
"houses": [
{
"id": 1,
"name": "house 1"
},
{
"id": 2,
"name": "house 2"
}
]
},
{
"id": 2,
"houses": [
{
"id": 3,
"name": "house 3"
}
]
}
]
而且我希望能够为每个用户的每个房子做一些异步的事情,所以我有一个带有这个签名的函数,它返回一个 promise :
sendWelcomeEmail(user, house)
现在,我知道当我有一个 promise 数组时如何使用 Bluebird 的 Promise.map
,但在这种情况下,我有一个包含数组的对象数组。调用 Promise.map
的正确方法是什么,所以我最终会为每个用户和房屋调用 sendWelcomeEmail
?
最佳答案
Promise.all(iterable) 方法返回单个 Promise,当可迭代参数中的所有 promise 都已解析或可迭代参数不包含任何 promises 时解析该 Promise。它以第一个拒绝的 promise 为由拒绝。
const data = [{
"id": 1,
"houses": [{
"id": 1,
"name": "house 1"
},
{
"id": 2,
"name": "house 2"
}
]
},
{
"id": 2,
"houses": [{
"id": 3,
"name": "house 3"
}]
}
];
const fakeSendWelcomeEmail = (id, house) => Promise.resolve(`${id} / ${house.name}`);
// Transforming the data into a flat array that contains the return value of fakeSendWelcomeEmail .
// So welcomeResults is an array of Promise.
const welcomeResults = data.reduce((res, user) => {
return res.concat(user.houses.map((house) => {
return fakeSendWelcomeEmail(user.id, house)
}));
}, [])
Promise.all(welcomeResults)
.then((results) => {
console.log(results);
})
我写了一个Promise polyfill我自己,如果你对引擎盖下的东西是如何工作的感到好奇,或者只是了解更多关于 Promise 的知识。
关于javascript - 带有数组对象数组的 Promise 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50375052/