我想映射并加入我的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组合成一个数组类型的对象。
但是......更改的对象不会通过它只传递原始对象。因此,我必须实现在每个"阶段"中更改的全局对象。
但是......这也行不通。全局对象始终是.then
或each
之前map
的最后一个值。
从本质上讲,我仍然不知道如何让它发挥作用。
答案 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
)