我使用node.js、Mongoose和Q库进行promise(https://github.com/kriskowal/q/wiki/API-Reference)
我想知道之间有什么区别
var Kitty = mongoose.model("Kitty");
var findKitties = Q.nbind(Kitty.find, Kitty);
findKitties({ cute: true }).done(function(theKitties) {
console.log(theKitties);
});
这个:
var Kitty = mongoose.model("Kitty");
var query = Kitty.find({ cute: true });
Q(query.exec()).done(function(theKitties) {
console.log(theKitties);
});
它们都有效,但哪一个更好?它们是一样的吗?
感谢
查看exec()
的Mongoose文档,您将看到:
aggregate.exec(callback);
// Because a promise is returned, the `callback` is optional.
var promise = aggregate.exec();
promise.then(..);
换句话说,Mongoose的exec
可以遵循节点回调风格或使用promise。
您提供的第一个示例Q.nbind()
假设exec
使用节点回调。在第二个例子中,Q()
假设传递给它的任何东西要么是承诺,要么是价值。
这两种方法都有效的唯一原因是Mongoose同时实现了节点回调和承诺。通常情况并非如此!
因为Mongoose已经在本地支持promise,所以选择
var query = Kitty.find({ cute: true });
Q(query.exec()).done(/* ... */);
而不是包装节点样式的回调:
var findKitty = Q.nbind(Kitty.find, Kitty);
findKitty({ cute: true }).done(/* ... */);
回答评论中的问题:
您有关于更新和删除的任何信息吗?
查看查询文档:
当回调函数:
如果
- 通过,则操作将立即执行并显示结果传递给回调
- 未传递,Query的实例为返回,它为您提供了一个特殊的QueryBuilder接口
所以基本上可以做这样的事情:
var query = Kitty.update({ cute: false }); // :(
query.exec().then(/* */)
而不是使用nbind:
var updateKitty = Q.nbind(Kitty.update, Kitty);
updateKitty({ cute: false }).then(/* */)
两者都可以,这取决于您是想在此时通过回调执行更新,还是在另一行使用exec
执行更新。有关详细信息,请阅读该文档。