2017-12-26 25 views
0

for-loop 내 Promise가 완료된 후 응답하려고합니다.Javascript는 응답을 보내기 전에 Promise가 for-loop 내에서 완료 될 때까지 기다립니다.

나는 thesequestions을 보았지만, 내 상황을 다루지 않습니다.

methodGetOrders 및 methodGetLines는 사용해야하는 외부 라이브러리의 일부입니다. 그들은 둘 다 네트워크 호출을하기 때문에 예상되는 지연이 있습니다. 이 함수는 내부 약속이 완료 될 때까지 기다리지 않으므로 항상 '0'을 반환합니다. 완료 할 약속을 '대기'할 방법이 없다는 것을 알고 있지만 응답에서 올바른 카운터 값을 얻으려면 어떻게해야합니까?

doWorkMainFunction() { 
    methodGetOrders() 
    .then(orderList => { 
     var counter=0; 
     for (var i=0; i< orderList.length; i++) { 
     methodGetLines() 
      .then (lineData => { 
       if (someCondition) { counter++; } 
      } // end of inner THEN 
     } // end FOR loop 
     return counter; // This always returns '0' 
    } // end of outer THEN 
} 

답변

2

루프의 모든 약속의 배열을 만든 다음 모든 약속

methodGetOrders() 
    .then(orderList => { 
    var counter = 0; 

    var promises = orderList.map(order => { 
     return methodGetLines() 
     .then(lineData => { 
      if (someCondition) { 
      counter++; 
      } 
     }) // end of inner THEN 
    }) // end promise map 
    return Promise.all(promises).then(_ => counter); 
    }) // end of outer THEN 
}) 
+0

죄송 해결 한 후 카운터 돌아 Promise.all()을 사용하여, 나는 자바 스크립트 비교적 새로운 오전, 그래서 나는되고 싶어 무언가에 대한 명확한 설명 : 코드에는 두 개의 return 문이 있습니다. 그것은 '허용'인가? – banncee

+0

원하는만큼 return 문을 사용할 수 있습니다. 여기에있는 것들은 다른 기능을합니다. – Tomalak

+1

첫 번째 반환은 각 배열 항목에 부여하기 위해 ['Array # map'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) 안에 있습니다. 그것은'methodGetLines()'... ...에 의해 반환 된 약속이기도합니다. 두번째는'methodGetOrders'를 반환합니다. – charlietfl