地图/加入蓝鸟和猫鼬

时间:2015-10-03 22:54:07

标签: node.js promise bluebird

我想映射并加入我的Mongoose模型,例如:

MyModel.myPromisifiedMethod parameter, (err,res) ->
.then((res) ->
  # do stuff to res
)
.then((res) ->
  Promise.map res, ((eachItem) ->
    # do stuff to to eachItem
    AnotherModel.get parameter, (err,res) ->
      # do stuff with res and eachItem
  )
  join eachItem, ((eachItem) ->
    console.log eachItem
  )
)
.then((finalResult) ->
  res.status(202).send
    result:finalResult
)

地图是一个迭代器,我需要它,因为我对Mongo的请求是50000个文档。但是上面没有用,特别是连接部分。我在网上找不到任何例子。感谢帮助。

这是我进一步工作的方式,包含以下答案:

MyModel.myPromisifiedMethod parameter, (err,res) ->
.then((res) ->
  Promise.all res.map (eachItem) ->
    # do stuff to to eachItem
    AnotherModel.get parameter, (err,res) ->
      # do stuff with res and eachItem
)
.map((res) ->
  # do stuff with res
)
.each((res) ->
  # do stuff with res
.then((finalResult) ->
  res.status(202).send
    result:finalResult
)
"第二个" .map似乎多余,但它确实有效。 .each有趣地像减少一样,至少我从Apache Spark知道它。 each将映射的和完全填充的promises组合成一个数组类型的对象。

但是......更改的对象不会通过它只传递原始对象。因此,我必须实现在每个"阶段"中更改的全局对象

但是......这也行不通。全局对象始终是.theneach之前map的最后一个值。

从本质上讲,我仍然不知道如何让它发挥作用。

1 个答案:

答案 0 :(得分:1)

我能想到的一种方法是使用Promise.all:

function mapReduce(inputs, mapFn, reduceFn){
    return Promise.all(inputs.map(mapFn)).then(reduceFn);
}

您的代码将变为:

MyModel.myPromisifiedMethod parameter, (err,res) ->
.then((res) ->
  # do stuff to res
)
.then((res) ->
  Promise.all res.map (eachItem) ->
    # do stuff to to eachItem
    AnotherModel.get parameter, (err,res) ->
      # do stuff with res and eachItem  
)
.then((res) ->
  res.reduce (sumdValue, eachItem) ->
    # do stuff to to eachItem
    eachItem + sumValue
)      
.then((finalResult) ->
  res.status(202).send
    result:finalResult
)