Q承诺-分析结果与nbind



我使用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执行更新。有关详细信息,请阅读该文档。

相关内容

  • 没有找到相关文章

最新更新