【问题标题】:Calling multiple functions inside for loop in javascript在javascript中的for循环中调用多个函数
【发布时间】:2017-03-21 06:04:35
【问题描述】:

我在 node js express 框架中工作,我有一个场景,我必须在 for 循环中调用 2-3 个嵌套回调函数。 以下是我的代码:

for (i in jdp_tb_trades) {
  var jdp_response_json_parsed = JSON.parse(jdp_tb_trades[i].jdp_response);
    processConsign(jdp_tb_trades[i].tid, function(err_process_consign, lpnumber) {
        if (err_process_consign) {
          console.log("Some error occurred in processConsign. Error is:" + err_process_consign);
          //Check if generate XML is enabled from admin end.
          configuration.getOneByKey('generateXml', function(err_configuration, result_configuration) {
              if (err_configuration) {
                console.log('[generateXml]: generate xml enabled/disabled - No response.');
                return callback(null, lpnumber);
              } else {
                if (result_configuration.value == 'true') {
                  console.log('[generateXml]: generate xml enabled.')
                  generateXml(jdp_tb_trades[i].tid, jdp_response_json_parsed, lpnumber, function(err_generate_xml, success_generate_xml);
                    if (err_generate_xml) {
                      return callback(err_generate_xml);
                    } else {
                      return callback(null, success_generate_xml);
                    }
                  });
              } else {
                console.log('[generateXml]: generate xml disabled.');
                return callback(null, lpnumber);
              }
            }
          });
      } else {

        //Check if generate XML is enabled.
        configuration.getOneByKey(
          'generateXml',
          function(err_configuration, result_configuration) {
            if (err_configuration) {
              console.log('[generateXml]: generate xml enabled/disabled - No response.');
              return callback(null, lpnumber);
            } else {
              if (result_configuration.value == 'true') {
                console.log('[generateXml]: generate xml enabled.')
                generateXml(jdp_tb_trades[i].tid, jdp_response_json_parsed, lpnumber, function(err_generate_xml, success_generate_xml) {
                  if (err_generate_xml) {
                    return callback(err_generate_xml);
                  } else {
                    return callback(null, success_generate_xml);
                  }

                });
              } else {
                console.log('[generateXml]: generate xml disabled.');
                return callback(null, lpnumber);
              }
            }
          });

    });
}

更新 上面的代码是一个名为 getOrders 的函数的一部分,它被称为:

module.exports = {
    getOrders: function (callback) {
        getOrders(function(err_getOrders, getOrdersResponse){
            if(err_getOrders){
                console.log("generate Order process error:"+err_getOrders);
                return callback(err_getOrders);
            }
            else{
                console.log("generate Order process success:"+getOrdersResponse);
                return callback(null, getOrdersResponse);
            }
        });
    },
}

我做了多个回调,因为函数在多个场景中结束。我不关心 getOrders 的输出,因为我不会在任何地方使用该输出。

这里我有两个函数 processConsign 和 generateXml。在 processConsign 的回调中调用 generateXml。但我认为 forloop 不会等待这两个任务完成并保持递增循环而不等待这两个函数的处理。

有什么方法可以让 for 循环等待这两个过程完成,然后执行下一个循环?

【问题讨论】:

  • 您期望 getOrdersResponse in return callback(null, getOrdersResponse); 的数组?
  • @kiro112 不,我不希望这里有任何数组。我只是想要一些输出。可能是字符串。这样我就可以知道该过程已正确执行。
  • 嗯。但在这种情况下,你有一个多重响应(循环)。但基于以上你只想要一个响应?
  • 是的。毕竟,每个循环都会执行一次回调。或者我可以继续附加每个循环的输出并调用一次回调并发送一次响应。
  • 请检查更新

标签: javascript node.js express for-loop


【解决方案1】:

您可以使用async.each

    async.each(jdp_tb_trades, (jdp_tb_trade, callback) => {
        // do manipulation here
        // return callback() after the process. pass err if error
    }, loop_ended (err) => {
        if (err) {
            // Error in loop | err callback returned with err
        }
        // loop already ended here
    });

请检查一下 const async = require('async');

    function getOrders (callback) {
        async.each(jdp_tb_trades, generate_xml, (err) => {
            if (err) {
                // the callback return err using callback(err)
            }
            else {
                // check the jdp_tb_trades. no error found
            }
        });
    }

    function generate_xml (jdp_tb_trade, callback) {
        let jdp_response_json_parsed; 

        try {
            jdp_response_json_parsed = JSON.parse(jdp_tb_trade.jdp_response);
        } catch (err) {
            return callback(err);
        }

        processConsign(jdp_tb_trade.tid, (err_process_consign, lpnumber) => {

            if (err_process_consign) {
                console.log(`Some error occurred in processConsign. Error is: ${err_process_consign}`);

                //Check if generate XML is enabled from admin end.
                configuration.getOneByKey('generateXml', (err_configuration, result_configuration) => {
                    if (err_configuration) {
                        console.log('[generateXml]: generate xml enabled/disabled - No response.');

                        // base on your callback it still a success response
                        // return callback(null, lpnumber);

                        jdp_tb_trade.lpnumber = lpnumber;
                        return callback();
                    }
                    else {
                        if (result_configuration.value == 'true') {
                            console.log('[generateXml]: generate xml enabled.')
                            generateXml(jdp_tb_trade.tid, jdp_response_json_parsed, lpnumber, (err_generate_xml, success_generate_xml) => {
                                if (err_generate_xml) {
                                    jdp_tb_trade.err_generate_xml = err_generate_xml;

                                    // return error
                                    return callback(err_generate_xml);
                                } else {
                                    jdp_tb_trade.success_generate_xml = success_generate_xml;

                                    return callback();
                                    // return callback(null, success_generate_xml);
                                }
                            });
                        }
                        else {
                            console.log('[generateXml]: generate xml disabled.');
                            return callback(null, lpnumber);
                        }
                    }
                });          
            }
            else {
                if (result_configuration.value == 'true') {
                    console.log('[generateXml]: generate xml enabled.')
                    generateXml(jdp_tb_trades[i].tid, jdp_response_json_parsed, lpnumber, (err_generate_xml, success_generate_xml) => {
                        if (err_generate_xml) {
                            return callback(err_generate_xml);
                        } else {
                            jdp_tb_trade.success_generate_xml = success_generate_xml;
                            // return callback(null, success_generate_xml);
                            return callback();
                        }
                    });
                }
                else {
                    console.log('[generateXml]: generate xml disabled.');
                    jdp_tb_trade.lpnumber = lpnumber;
                    return callback();

                    // return callback(null, lpnumber);
                }
            }
        });
    }

【讨论】:

  • 将 async.each 确保我的函数执行后我的循环会增加吗?
  • 它应该可以工作。但是你需要调整你的实现,因为你返回不同的回调,你能分享你如何调用这个函数吗?因为 async.each 只能修改函数并返回错误,不能返回多个回调
  • 我对我的问题进行了更新。我在函数结束的地方进行了多次回调。
  • 我无法理解您更新的解决方案 kiro。你有
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2017-12-16
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多