Q和猫鼬混淆

时间:2014-04-18 18:07:23

标签: javascript node.js mongoose q

我正在对一些mongoose文档进行一些稍微复杂的后期处理,最后我添加了Q来帮助管理异步。我可以把事情搞定但是我对引擎盖下发生的事情有点困惑,如果我使用函数来返回Q.nfcall返回的承诺而不是仅使用返回承诺的Q.nfcall,我会得到不同的行为本身。我所描述的场景在代码中可能更清晰:

...
return Q.all([
    Q.nfcall(doc.save.bind(doc)),
    Q.nfcall(doc2.save.bind(doc2))
])
// confused on this line
.then(Q.nfcall(doc3.save.bind(doc3)))
.then(function(val) {
    console.log('val', val);
});

所以这最终会记录一个数组,它是Q.all promises的结果。我期待的是doc3保存的结果,因为它来自链中的后期。

现在当我更改doc3保存以使用这样的匿名函数时:

...
return Q.all([
    Q.nfcall(doc.save.bind(doc)),
    Q.nfcall(doc2.save.bind(doc2))
])
// changed this line
.then(function() {
    return Q.nfcall(doc3.save.bind(doc3))
})
.then(function(val) {
    console.log('val', val);
});

我得到了我期望的结果,即传递给final的val是doc3 save的结果。

我觉得有些东西我很想念。这段代码在功能上是不相同的吗?

1 个答案:

答案 0 :(得分:0)

如果您的then()中没有匿名函数,则承诺不会忽略已解决的数据而不会忽略其他任何内容。它保留了通过更多分辨率传递数据的能力。匿名函数允许您接受数据作为参数,然后在继续之前用它做更多的事情。