질문의 제목, "서로 약속을 차례로 해결합니까 (예 : 순서대로)?"에 따라 OP는 순차적 호출 자체 보다 정산 약속의 순차적 처리에 더 관심이 있음을 이해할 수 있습니다. .
이 답변이 제공됩니다 :
- 응답을 순차적으로 처리하는 데 순차적 호출이 필요하지 않음을 보여줍니다.
- 1 년이 지난 후에도 여전히 관심이있는 경우 OP를 포함하여이 페이지 방문자에게 실행 가능한 대체 패턴을 노출합니다.
- OP의 주장에도 불구하고, 동시에 전화를 걸고 싶지 않다는 주장도 있지만, 이는 제목이 의미하는대로 순차적으로 응답을 처리하려는 요구에 기반한 가정 일 수도 있습니다.
동시 통화를 원치 않으면 순차 통화 등을 포괄하는 Benjamin Gruenbaum의 답변을 참조하십시오.
그러나 동시 호출을 허용하고 순차적으로 응답을 처리하는 패턴에 관심이있는 경우 (성능 향상을 위해) 계속 읽으십시오.
Promise.all(arr.map(fn)).then(fn)
(내가 여러 번 한 것처럼) Promise lib의 멋진 설탕 (특히 Bluebird 's) 을 사용해야한다고 생각 하고 싶지만 ( 이 기사에arr.map(fn).reduce(fn)
의지 하여) 패턴은 다음과 같은 이점이 있습니다.
- 프리미티브 버전의 jQuery조차도 모든 약속 라이브러리와 함께 작동합니다.
.then()
.
- 한 줄 모드로 원하는 것을 건너 뛰거나 오류를 건너 뛸 수있는 유연성을 제공합니다.
여기에 쓰여진 것입니다 Q
.
var readFiles = function(files) {
return files.map(readFile) //Make calls in parallel.
.reduce(function(sequence, filePromise) {
return sequence.then(function() {
return filePromise;
}).then(function(file) {
//Do stuff with file ... in the correct sequence!
}, function(error) {
console.log(error); //optional
return sequence;//skip-over-error. To stop-on-error, `return error` (jQuery), or `throw error` (Promises/A+).
});
}, Q()).then(function() {
// all done.
});
};
참고 : 하나의 조각 만 Q()
Q에 고유합니다. jQuery의 경우 readFile ()이 jQuery 약속을 반환하는지 확인해야합니다. A + 라이브러리를 사용하면 외국 약속이 동화됩니다.
열쇠는 여기에 감소의 인 sequence
시퀀스 약속, 취급 의 readFile
그들의 창조를 약속하지만.
그리고 일단 당신이 그것을 흡수하면, .map()
무대가 실제로 필요하지 않다는 것을 깨달았을 때 약간의 생각이 날 것입니다 ! 전체 작업, 병렬 호출 및 올바른 순서로 직렬 처리를 reduce()
단독 으로 수행 할 수 있으며 다음 과 같은 유연성이 추가됩니다.
- 한 줄만 이동하여 병렬 비동기 호출에서 직렬 비동기 호출로 변환-개발 중에 유용 할 수 있습니다.
Q
다시 여기 있습니다 .
var readFiles = function(files) {
return files.reduce(function(sequence, f) {
var filePromise = readFile(f);//Make calls in parallel. To call sequentially, move this line down one.
return sequence.then(function() {
return filePromise;
}).then(function(file) {
//Do stuff with file ... in the correct sequence!
}, function(error) {
console.log(error); //optional
return sequence;//Skip over any errors. To stop-on-error, `return error` (jQuery), or `throw error` (Promises/A+).
});
}, Q()).then(function() {
// all done.
});
};
이것이 기본 패턴입니다. 데이터 (예 : 파일 또는 일부 변환)를 호출자에게 전달하려면 약간의 변형이 필요합니다.