2014-10-09 178 views
1

我一直希望能快速的問題的人有更多的知識比我節點貓鼬的MongoDB和異步

如果我有,基本上建立一個實體,並使用直接保存它的MongoDB節點API的實現代碼Mongoose,我是否需要將所有包含在承諾庫中的代碼包裝爲儘可能異步?或者Mongoose/MongoDB Node庫的實現已經以異步的方式完成了他們的工作,所以我在消息泵上唯一的開銷就是創建對象。

下面的代碼是我們在API中的代碼,它創建了下面的承諾並執行它,我只是想知道,如果Mongoose/MongoDB庫是異步的,承諾的開銷實際上是否值得。

希望一切都有道理。

function action(promise) { 
    var date = new Date(), 
    taskWorkQueue = new TaskWorkQueueModel({ 
      "TaskId": taskid, 
      "metadata": metadata, 
      "State": 0, 
      "TaskType": taskType, 
      "ApplicationName" : token.ApplicationName , 
      "dateEntered": date}); 
    taskWorkQueue.save(function (err) { 
     if (err) 
     { 
      promise.reject(err); 
     } 
     else 
     { 
      promise.resolve(taskWorkQueue); 
     } 

    }); 

回答

3

這不是將這些東西包裝在承諾中的原因。所有良好的節點庫(如Mongoose)都已經是異步的。使用承諾只是爲您提供另一種編寫代碼的方式,而不是使用回調。

看看documentation for q,它們展示了一個例子,說明你可以從promise和回調中得到什麼樣的編碼風格差異。

step1(function (value1) { 
    step2(value1, function(value2) { 
     step3(value2, function(value3) { 
      step4(value3, function(value4) { 
       // Do something with value4 
      }); 
     }); 
    }); 
}); 

Q.fcall(promisedStep1) 
.then(promisedStep2) 
.then(promisedStep3) 
.then(promisedStep4) 
.then(function (value4) { 
    // Do something with value4 
}) 
.catch(function (error) { 
    // Handle any error from all above steps 
}) 
.done(); 

另外值得一提的是,貓鼬通過mpromise已經支持的承諾,你不應該需要自己包裝它們。還有一些庫可以使用其他承諾框架,如mongoose-q

+0

感謝蒂莫西,來自C#異步我犯了一個錯誤,認爲承諾實際上是作爲一個單獨的(線程/纖維/東西)運行。我現在看到它基本上是回調語法上的糖,給出了一些看起來像C#中基於異步的任務延續。感謝您的澄清,非常感謝。 – Bigtoe 2014-10-09 15:08:31