javascript - 带有数组对象数组的 Promise 映射

标签 javascript promise

我有以下数据结构:

[
  {
    "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

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/

相关文章:

node.js - 我们应该使用 Async/Await 还是 Then 闭包来避免内存泄漏?

javascript - 解析云代码 - promise 问题

javascript - javascript中的顺序函数调用

javascript - 使用 Three.js THREE.textureLoader 预加载多个纹理

javascript - 如何计算阈值(基础数学)

javascript - 如何使用 Trello 的 API 打开新看板

javascript - 将 location.href 附加到 iframe 内的表单

javascript - WinJS,从一个可能异步也可能不异步的函数返回一个 promise

javascript - 如何在 JavaScript 中将字符串限制为一组特定的字符?

javascript - Clearbox 是否已被弃用?