在javascript中调用for循环中的多个函数

时间:2017-03-21 06:04:36

标签: javascript node.js express for-loop

我在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不会等待这两个任务完成并继续增加循环而不等待处理这两个函数。

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

1 个答案:

答案 0 :(得分:0)

您可以使用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);
                }
            }
        });
    }