2014-02-10 90 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'來運行該查詢並獲得承諾。 –