2017-03-21 1 views
0

노드 js express 프레임 워크에서 작업 중이며 루프 내에서 2-3 중첩 콜백 함수를 호출해야하는 시나리오가 있습니다. 다음은 내 코드입니다 : 나는 여러 콜백을 한여러 함수를 자바 스크립트에서 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의 출력에 대해 걱정하지 않습니다.

여기에는 processConsign 및 generateXml의 두 가지 기능이 있습니다. generateXml은 processConsign의 콜백에서 호출됩니다. 그러나 for 루프는이 두 가지 작업이 완료 될 때까지 기다리지 않고이 두 기능의 처리를 기다리지 않고 루프를 계속 증가시키는 것으로 생각합니다.

이 두 프로세스를 완료하고 다음 루프를 실행하기 위해 루프 대기를 수행 할 수있는 방법이 있습니까?

+0

콜백 (null, getOrdersResponse) 콜백에서 ___getOrdersResponse___'에 대한 배열이 필요합니다. – kiro112

+0

@ kiro112 아니요 여기에 배열이 필요하지 않습니다. 나는 약간의 결과 만 원한다. 문자열 일 수 있습니다. 그래서 프로세스가 제대로 실행되었는지 알 수 있습니다. – Simer

+0

흠. 이 경우 다중 응답 (루프)이 있습니다. 하지만 위의 자료는 단 하나의 응답 만 원하십니까? – 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

wll async.each 내 루프가 증가합니다 그 후에 내 함수가 실행되도록하십시오? – Simer

+0

작동해야합니다. 다른 콜백을 반환하기 때문에 구현을 조정해야합니다.이 함수를 호출하는 방법을 공유 할 수 있습니까? async.each는 함수를 수정하고 오류 만 반환 할 수 있지만 여러 콜백을 반환 할 수 없기 때문에 – kiro112

+0

내 질문에 업데이트했습니다. 함수가 끝나는 곳에서 여러 콜백을 만들고 있습니다. – Simer

관련 문제