对于比我更多知识的人,我希望能够快速提问。
如果我在Node api实现中有代码,它基本上创建了一个实体并使用Mongoose将它直接保存到MongoDB,我是否需要将所有这些包装在promise库中以使其尽可能异步?或者Mongoose / MongoDB节点库的实现是否已经以异步方式工作,因此我在消息泵上的唯一开销就是创建对象。
下面的代码是我们在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);
}
});
答案 0 :(得分:3)
这不是将这些东西包含在承诺中的原因。所有好的节点库(如Mongoose)都已经异步。使用promise只是为您提供了另一种编写代码的方法,而不是使用回调。
看一下documentation for q,他们展示了一个例子,说明你可以从承诺与回调中获得的编码风格有何不同。
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-q这样的猫鼬的其他承诺框架。