如何确保在某一点之前完成异步功能。节点JS

时间:2015-12-01 20:10:48

标签: node.js asynchronous

我有这3个mssql存储过程执行,每个都获得数据数组,并且每个数据都被推送到变量storedresults。

但是,在一天结束时,只完成第一次和最后一次执行,并在完成根函数后完成中间执行,因此不会推送中间执行的数组值。

function merchantGetSetting(inputData, callback) {


storedgetSettingProcedure.exec(function(error, results) {
    if (error) {
        winston.info("ERROR WITH EXECUTING GET SETTING STORED PROCEDURE: " + JSON.stringify(error));
    }
    else {
        winston.log('info', "SUCCESSFULLY EXECUTED GET SETTING STORED PROCEDURE");
        storedresults.push([results]);

        }
    });

storedgetIntegrationProcedure.exec(function(error, results) {
    if (error) {
        winston.info("ERROR WITH EXECUTING GET SETTING STORED PROCEDURE: " + JSON.stringify(error));
    }
    else {
        winston.log('info', "SUCCESSFULLY EXECUTED GET INTEGRATION STORED PROCEDURE");
        storedresults.push([results]);
    }
});


storedgetAccoutListProcedure.exec(function(error, results) {
    if (error) {
        winston.info("ERROR WITH EXECUTING GET SETTING STORED PROCEDURE: " + JSON.stringify(error));
    }
    else {

            winston.log('info', "SUCCESSFULLY EXECUTED GET MERCHANT LIST STORED PROCEDURE");
            storedresults.push([results]);
            callback(null, storedresults)
    }
});

我知道一种解决此问题的方法(同步调用),但我想知道更优雅的方式,并希望对它进行简单的修复。

2 个答案:

答案 0 :(得分:0)

因为我知道只有中间存储过程执行太晚了,所以我在该函数上使用了process.nextTick,并将回调函数从最后一个函数转移到app.js,就像这样。

 process.nextTick(function() { 
storedgetIntegrationProcedure.exec(function(error, results) {
if (error) {
    winston.info("ERROR WITH EXECUTING GET SETTING STORED PROCEDURE: " + JSON.stringify(error));
}
else {
    winston.log('info', "SUCCESSFULLY EXECUTED GET INTEGRATION STORED PROCEDURE");
    storedresults.push([results]);
callback(null, storedresults)
}
});
}

这个过程.nextTick确保中间函数最后完成,我能够获得我想要的数据。

我仍然愿意接受更多建议,但这是我想过的最简单的解决方案。

答案 1 :(得分:0)

您是否尝试过使用async

它有很多功能可以通过不同方式实现这一目标。

查看.parallel