使用q nodejs完成promise后调用回调

时间:2015-03-29 06:05:11

标签: node.js callback q

我使用Q promise库进行数据库调用。但是,在第一个承诺内部然后()完成之前,第二个then()承诺开始。代码如下:

var promise = Q.nfcall(function(){});
promise.then(removeFromOldList(data))
    .then(addToNewList(data))
    .done();

function removeFromOldList(data) {
    console.log('removeFromOldList');

    // remove the card from old list
    DB.ListTable.findOne({ _id : data.oldId},
        function(err, snippet) {
            if(err) console.error("An error occurred");
            if (err) console.error(err);

            console.log('removed the card from old list');
        })

}

function addToNewList(data) {
    console.log('addToNewList');

    // add the card to the new list
    DB.ListTable.findOne({ _id: data.newId},
        function(err, snippet) {
            if(err) console.error("An error occurred");
            if (err) console.error(err);

            console.log('add the card to the new list');
        })

}

控制台日志告诉我:

  

removeFromOldList

     

addToNewList

     

从旧列表中删除卡片添加

     

卡到新列表

如何在返回promise之前执行回调。

1 个答案:

答案 0 :(得分:0)

问题是DB.ListTable.findOne调用是异步的,因此节点在进行数据库回调之前都会经历这两个函数。

你可以尝试这样的事情:

var query1 = DB.ListTable.findOne({ _id : data.oldId}, function(err, snippet) {
        ...
    }).exec();
var query2 = DB.ListTable.findOne({ _id: data.newId}, function(err, snippet) {
        ...
    }).exec();
var promise = Q.nfcall(function(){});
promise
    .then(query1)
    .then(query2)
    .done();