2017-03-21 36 views
0

我在节点js express框架中工作,我有一个场景,我必须调用2-3循环内嵌的回调函数。 下面是我的代码:在JavaScript中调用循环内的多个函数

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

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

+0

您期待___getOrdersResponse__数组返回回调(null,getOrdersResponse);'? – kiro112

+0

@ kiro112不,我不期待任何阵列在这里。我只是想要一些输出。它可能是字符串。这样我就可以知道这个过程已经正确执行了。 – Simer

+0

嗯。但在这种情况下,你有一个多重响应(循环)。但基于上面,你只需要一个单一的回应? – kiro112

回答

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

请检查该 常量异步=需要( '异步');

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

wll async.each确保我的函数执行后,我的循环将增加? – Simer

+0

它应该工作。但你需要调整你的实现,因为你正在返回不同的回调,你能分享你如何调用这个函数吗? 因为async.each只能修改函数并返回错误但不能返回多个回调 – kiro112

+0

我已经在我的问题中做了更新。我正在做多个函数结束的回调。 – Simer