명시 적 통과
콜백 중첩과 마찬가지로이 기술은 클로저에 의존합니다. 그러나 체인은 평평한 상태를 유지합니다. 최신 결과 만 전달하는 대신 모든 단계마다 일부 상태 객체가 전달됩니다. 이 상태 개체는 이전 작업의 결과를 누적하여 나중에 다시 필요한 모든 값과 현재 작업의 결과를 모두 전달합니다.
function getExample() {
return promiseA(…).then(function(resultA) {
// some processing
return promiseB(…).then(b => [resultA, b]); // function(b) { return [resultA, b] }
}).then(function([resultA, resultB]) {
// more processing
return // something using both resultA and resultB
});
}
여기서 작은 화살표 b => [resultA, b]
는를 닫고 resultA
두 결과의 배열을 다음 단계로 전달하는 함수입니다 . 매개 변수 파괴 구문을 사용하여 단일 변수로 다시 분류합니다.
ES6로 구조화가 가능해지기 전에, .spread()
많은 promise 라이브러리 ( Q , Bluebird , when ,…)에 의해 호출되는 멋진 도우미 메소드 가 제공되었습니다 . 각 배열 요소마다 하나씩 여러 매개 변수가있는 함수를 사용합니다 .spread(function(resultA, resultB) { …
.
물론 여기에 필요한 클로저는 일부 도우미 기능, 예를 들어
function addTo(x) {
// imagine complex `arguments` fiddling or anything that helps usability
// but you get the idea with this simple one:
return res => [x, res];
}
…
return promiseB(…).then(addTo(resultA));
또는 Promise.all
어레이에 대한 약속을 생성하기 위해 고용 할 수 있습니다 .
function getExample() {
return promiseA(…).then(function(resultA) {
// some processing
return Promise.all([resultA, promiseB(…)]); // resultA will implicitly be wrapped
// as if passed to Promise.resolve()
}).then(function([resultA, resultB]) {
// more processing
return // something using both resultA and resultB
});
}
그리고 배열뿐만 아니라 임의로 복잡한 객체를 사용할 수도 있습니다. 예를 들어, 다른 도우미 기능을 사용 _.extend
하거나 사용 Object.assign
하는 경우 :
function augment(obj, name) {
return function (res) { var r = Object.assign({}, obj); r[name] = res; return r; };
}
function getExample() {
return promiseA(…).then(function(resultA) {
// some processing
return promiseB(…).then(augment({resultA}, "resultB"));
}).then(function(obj) {
// more processing
return // something using both obj.resultA and obj.resultB
});
}
이 패턴은 플랫 체인을 보장하고 명시 적 상태 객체는 선명도를 향상시킬 수 있지만 긴 체인에는 지루할 것입니다. 특히 산발적으로 만 필요한 상태 인 경우에도 모든 단계를 거쳐야합니다. 이 고정 인터페이스를 사용하면 체인의 단일 콜백이 다소 밀접하게 결합되어 변경하기가 어렵습니다. 단일 단계를 더 어렵게 만들 수 있으며 다른 모듈에서 직접 콜백을 제공 할 수 없습니다. 상태를 신경 쓰는 상용구 코드로 항상 래핑해야합니다. 위와 같은 추상 도우미 기능은 고통을 약간 완화시킬 수 있지만 항상 존재합니다.
javascript
다른 언어와 관련이 있습니다. 난 그냥 사용 "체인을 깰"대답은 자바와 jdeferred