2016-06-05 3 views

답변

0

완성 된 반복 횟수를 계산하려면 변수가 필요하므로 카운터가 반복 처리되는 요소 수와 같은지 확인할 수 있습니다.

counter = 0; 
_.forEach(arrayOfFiles, function (file) { 
    var url = file.link; 
    //Download file in device() 
    counter++; 
    if(counter == _.length){ 
     //it's finished 
    } 
}); 
1

당신은 무엇을 "결정"할 필요가 없습니다, 당신의 _.forEach() 실행됩니다 후 루프 마감을 다음 코드.

_.forEach(arrayOfFiles, function (file) { 
     var url = file.link; 
     //Download file in device() 
    }); 

callAnotherMethod(); 

추신. "파일을 다운로드하십시오."주석은 비동기 호출에 대해 우려 할만한 의견을 제시합니다. 음, 비동기 호출을 처리해야합니다.

0

forEach은 동기 연산입니다. 그래서 resolve()가 호출 될 때 모든 반복이 이미 실행되었다는 것을 보장합니다.

그러나 각 반복에서 비동기 작업을 수행하고 모든 작업이 완료 될 때까지 기다리는 것이 좋습니다. 이것은 약속을 통해 우아하게 처리 될 수 있습니다.

약속을 반환하는 비동기 함수 (promisify를 사용하지 않는 경우)를 사용하면 arrayOfFiles를 약속 배열에 매핑하고 Promise.all을 사용하여 약속 배열을 단일 약속에 결합 할 수 있습니다 배열의 모든 약속이 해결되면 해결됩니다.

return $q(function (resolve, reject) { 
    var arrayOfPromises = _.map(arrayOfFiles, function (file) { 
    var url = file.link; 
    return downloadFile(url) 
    }); 

    Promise 
    .all(arrayOfPromises) 
    .then(resolve) 
    .catch(reject); 
}); 

이 시점에서 promise 생성자를 호출 할 필요가 없습니다. 당신은 쓸 수 있습니다 : ES6의

return Promise.all(_.map(arrayOfFiles, function (file) { 
    return downloadFile(file.link) 
})) 

이 될 수 있습니다 더 간결 복용 장점 특징 : 사실

return Promise.all(arrayOfFiles.map(({ link }) => downloadFile(link))) 

명시 적으로 약속 should be considered 안티 패턴을 생성. 약속 구성 유틸리티에 의존하는 것이 거의 항상 더 나은 방법입니다.

관련 문제