2014-02-10 91 views
0

林与node.js的工作,猫鼬和Q库的承诺(https://github.com/kriskowal/q/wiki/API-ReferenceQ承诺 - 解析结果VS nbind

我想知道有什么区别:

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); 
}); 

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

感谢

回答

2

看看的Mongoose documentation for exec(),你会看到:

aggregate.exec(callback); 

// Because a promise is returned, the `callback` is optional. 
var promise = aggregate.exec(); 
promise.then(..); 

换句话说,猫鼬的exec可以按照节点回调风格使用的承诺。

您提供的第一个示例Q.nbind()假定exec使用节点回调。在第二个例子中,Q()假定传递给它的任何东西都是承诺或价值。

这两种方法的唯一原因是因为Mongoose实现了节点回调和承诺。通常情况并非如此!


因为猫鼬已经支持的承诺本身,去

var query = Kitty.find({ cute: true }); 
Q(query.exec()).done(/* ... */); 

,而不是包裹节点样式的回调:

var findKitty = Q.nbind(Kitty.find, Kitty); 
findKitty({ cute: true }).done(/* ... */); 

要评论回答一个问题:

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

看一看的queries documentation

当一个回调函数:

  • 传递,操作将被立即传递给回调的结果 执行。
  • 未通过,返回Query实例为 ,它为您提供了一个特殊的QueryBuilder界面。

所以基本上它可能做这样的事情:

var query = Kitty.update({ cute: false }); // :(
query.exec().then(/* */) 

,而不是使用nbind:

var updateKitty = Q.nbind(Kitty.update, Kitty); 
updateKitty({ cute: false }).then(/* */) 

双方将工作,它给你,如果你想执行此时使用回调进行更新,或在使用exec的另一行中进行更新。阅读该文档以获取更多信息。

+0

谢谢你的答案..只是为了记录,你有更新和删除的任何信息?我认为他们确实需要使用nbind吗? – davibq

+0

很高兴帮助。我已经更新了我的答案 - 我从来没有使用猫鼬,所以我必须做一些四处看看。 –

+0

更新了第一个示例。基本上建立一个查询,它是'Kitty.find'或'Kitty.update',然后调用'.exec'来运行该查询并获得承诺。 –