我正在使用node.js,Mongoose和Q库进行承诺(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);
});
他们都工作,但哪一个更好?它们是一样的吗?
由于
答案 0 :(得分:2)
查看Mongoose documentation for exec()
,您会看到:
aggregate.exec(callback);
// Because a promise is returned, the `callback` is optional.
var promise = aggregate.exec();
promise.then(..);
换句话说,Mongoose的exec
可以遵循节点回调样式或使用promises。
您提供的第一个示例Q.nbind()
假定exec
使用节点回调。在您的第二个示例中,Q()
假定传入其中的任何内容都是承诺或值。
两种方法都有效的唯一原因是因为Mongoose已经实现了节点回调和承诺。通常情况并非如此!
因为Mongoose本身已经支持promises,所以请选择
var query = Kitty.find({ cute: true });
Q(query.exec()).done(/* ... */);
而不是包装节点样式回调:
var findKitty = Q.nbind(Kitty.find, Kitty);
findKitty({ cute: true }).done(/* ... */);
回答评论中的问题:
您有关于更新和删除的任何信息吗?
当回调函数:
- 被传递,操作将立即执行结果 传递回调。
- 未通过,Query的实例是 return,它为您提供了一个特殊的QueryBuilder接口。
所以基本上可以做这样的事情:
var query = Kitty.update({ cute: false }); // :(
query.exec().then(/* */)
而不是使用nbind:
var updateKitty = Q.nbind(Kitty.update, Kitty);
updateKitty({ cute: false }).then(/* */)
如果你想在当时使用回调执行更新,或者在使用exec
的另一行中执行更新,则两者都可以工作。阅读该文档以获取更多信息。