Q promises - 解析结果vs nbind

时间:2014-02-10 19:08:42

标签: node.js promise q

我正在使用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);
});

他们都工作,但哪一个更好?它们是一样的吗?

由于

1 个答案:

答案 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(/* ... */);

回答评论中的问题:

  

您有关于更新和删除的任何信息吗?

看看queries documentation

  

当回调函数:

     
      
  • 被传递,操作将立即执行结果   传递回调。
  •   
  • 未通过,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的另一行中执行更新,则两者都可以工作。阅读该文档以获取更多信息。