2017-03-21 15 views
0

私はノードjs expressフレームワークで作業していますが、forループ内で2-3ネストされたコールバック関数を呼び出す必要があります。 以下は私のコードです:私は複数のコールバックをした複数の関数をjavascript内のforループ内で呼び出す

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

関数がで終わるので:

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複数のシナリオ。私はどこでもその出力を消費するつもりはないので、getOrdersの出力は心配していません。

私は2つの関数processConsignとgenerateXmlを持っています。 generateXmlはprocessConsignのコールバックで呼び出されます。しかし、私はforloopがこれらの2つのタスクが完了し、これらの2つの関数の処理を待たずにループをインクリメントし続けるのを待つことはないと思います。

私はこの2つのプロセスの完了を待ってループを待ってから次のループを実行する方法はありますか?

+0

リターンコールバック(null、getOrdersResponse)で '___getOrdersResponse___'の配列が必要ですか? – kiro112

+0

@ kiro112いいえここに配列がないとは思いません。私はちょうどいくつかの出力をしたい。それは文字列かもしれません。私はプロセスが適切に実行されたことを知ることができます。 – Simer

+0

hmm。この場合、複数の応答(ループ)があります。あなたの上には単一の応答だけが必要ですか? – kiro112

答えて

0

あなたは親切にこの のconstをチェック非同期=( '非同期')を必要と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

私のループが増分された後に私の関数が実行されることを保証async.each? – Simer

+0

それは動作するはずです。別のコールバックを返すので実装を調整する必要がありますが、この関数の呼び出し方法を共有できますか? async.eachは関数を修正してエラーを返すことができますが、複数のコールバックを返すことはできません – kiro112

+0

私は私の質問で更新しました。私は関数が終わるところで複数のコールバックを作っています。 – Simer

関連する問題