节点Mongoose的MongoDb和asynchronous性

我希望能有一个比我更多的知识的人一个快速的问题。

如果我有一个基本上创build一个实体并使用Mongoose将其直接保存到MongoDB的Node api实现中的代码,是否需要将所有包含在承诺库中的代码包装为尽可能asynchronous? 或者Mongoose / MongoDB Node库的实现已经以asynchronous的方式完成了他们的工作,所以我唯一的消息泵开销就是对象的创build。

下面的代码是我们在API中的代码,它创build了下面的承诺并执行它,我只是想知道,如果Mongoose / MongoDB库是asynchronous的,承诺的开销实际上是否值得。

希望一切都有道理。

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

这不是将这些东西包装在承诺中的原因。 所有良好的节点库(如Mongoose)已经是asynchronous的。 使用承诺只是给你一个替代方式来编写代码,而不是使用callback。

看看q的文档 ,他们展示了一个例子,你可以从promise和callback中得到什么样的编码风格差异。

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

另外值得一提的是,mongoose已经通过mpromise支持诺言了,你不需要自己包装。 还有一些图书馆可以使用像mongoose一样的mongoose周围的其他承诺框架。