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 안티 패턴을 생성. 약속 구성 유틸리티에 의존하는 것이 거의 항상 더 나은 방법입니다.