节点Mongoose MongoDb和异步性

时间:2014-10-09 13:48:02

标签: node.js mongodb asynchronous mongoose

对于比我更多知识的人,我希望能够快速提问。

如果我在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);
        }

    });

1 个答案:

答案 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这样的猫鼬的其他承诺框架。