【问题标题】:how to ensure async functions to be completed before certain point. Node JS如何确保异步功能在某个时间点之前完成。节点JS
【发布时间】:2015-12-02 07:56:44
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么不并行执行所有三个 SP 调用,然后在它们全部完成后推送结果?
  • 我还没学过异步库。我会试一试,看看效果如何。谢谢
  • 我发现:github.com/petkaantonov/bluebird 很容易使用。

标签: node.js asynchronous


【解决方案1】:

因为我知道只有中间存储过程执行完成得太晚了,所以我在那个函数上使用了 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)
}
});
}

这个 process.nextTick 确保了中间功能最后完成,我能够得到我想要的数据。

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

【讨论】:

    【解决方案2】:

    您尝试过使用async 吗?

    它有很多功能可以以不同的方式实现这一点。

    看看.parallel

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多