【问题标题】:Push to external object from inside a map function with a promise使用承诺从地图函数内部推送到外部对象
【发布时间】:2018-02-10 12:09:31
【问题描述】:

我知道这是 stackoverflow 上的热门话题,但我在使用 promise 函数填充外部对象时遇到了问题。

所以基本上我想做什么:

  • 通过 promise 获取我想要迭代的对象数组
  • 使用 map 函数迭代这个数组。每次迭代都调用一个 Promise
  • 在第二个承诺解决后,我想将一个 Id 和承诺的结果推送到一个数组中

我当然不能使用全局对象,因为承诺不在正确的范围内。我也尝试过 Bluebird Promise.map 函数,但这样我无法推送到对象,而不仅仅是第二个 promise 结果。

到目前为止,这是我的代码。 PromiseTwo 应该填充一个对象,我想在 res.json 函数中显示它(这是一个 Express/NodeJS 应用程序)

let promise = actie.groupActies()
let akties = {}
promise.then(function(aktieMaanden) {
    let values = aktieMaanden.forEach((aktie) => {
        let aktieId = aktie['_id']
        let artikelen = aktie['artikelen']
        let promiseTwo = order.getActieArtikelenOmzet(artikelen)
        promiseTwo.then(function(orders) {
            akties[aktieId] = orders
            return akties
        })
    })
    return akties
}).then((akties) => {
    res.json({ message: "Omzet voor aktie", akties: akties })
})

【问题讨论】:

    标签: javascript promise bluebird


    【解决方案1】:

    详细说明 Jonas w 的答案,使用 Promise.map 也可以:

    actie.groupActies()
    .then(acties =>
        Promise.map(acties, actie =>
           order.getActieArtikelenOmzet(actie.artikelen)
           .then(orders => [actie._id,orders])
        )
    )
    .then(results => {
       res.json({ message: "Omzet voor aktie", akties: results})
    })
    

    【讨论】:

      【解决方案2】:

      通过 promise 获取我想要迭代的对象数组

      actie.groupActies()
      

      使用 map 函数遍历这个数组。每次迭代都调用一个 Promise

      .then( acties => Promise.all(
        acties.map(actie => 
          order.getActieArtikelenOmzet(actie.artikelen)
          .then(orders => [actie._id,orders])
        )
       ))
      

      在第二个承诺解决后,我想将一个 Id 和承诺的结果推送到一个数组

      .then(results=> res.json({results}))
      

      这里的主要思想是使用 Promise.all 以便它仅在 所有 个订单都完成后继续。

      【讨论】:

      • 是的,非常感谢。诀窍在于 .the(orders => [actie._id,orders],它返回了一个对象。我什至可以用 Promise.map 将它写得更小:actie.groupActies() .then(acties => Promise.map(acties, actie => order.getActieArtikelenOmzet(actie.artikelen) .then(orders => [actie._id,orders]) )) .then(results => { res.json({ message: "Omzet voor aktie", akties: results }) })
      • @patrick steenks 这也是一个很好的解决方案。 Ypu 可以作为未来读者的答案......(实际上我的解决方案确实返回一个二维数组而不是一个对象数组;)
      • 做到了,谢谢。现在正在返回一个对象数组:)
      猜你喜欢
      • 2020-02-13
      • 2019-07-23
      • 1970-01-01
      • 2016-08-08
      • 2018-04-17
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 2016-09-30
      相关资源
      最近更新 更多