예를 들어, 비동기식 A.func1()이 있고 x1 객체를 반환할 수 있습니다. 또한 비동기식이며 x1을 기반으로 실행해야 하는 B.func2()도 있고 그 다음에는 B가 있습니다. .func2는 최종 값 t를 반환하며, 이 최종 값 t를 기반으로 일부 프롬프트 표시가 수행됩니다. 이건 어떻게 써야 하나요?
제가 직접 작성한 코드는 이렇습니다
그런데 사용하든 안하든 효과는 똑같은거같은데...역시 피라미드로 돌아갑니다
世界只因有你2017-05-15 16:53:30
"Promise 연속 호출 중 상태 저장"에 대한 댓글의 보충 댓글에 대해 몇 가지 전략을 자세히 설명하고 싶습니다
즉, A.func1, B.func2 및 익명 함수(func3이라고 함)의 호출 프로세스에 상태가 포함되지 않도록 논리를 조정합니다. 즉, func3이 func2의 출력에만 의존하고 그렇지 않은 경우 func1의 출력. 또는 func2가 func1에 의존하지 않도록 하려면 Promise.all
과 같은 것을 사용하여 func1과 func2의 결과를 동시에 가져와 func3Promise.all
来同时拿到func1和func2的结果丢给func3
优点:state可扩展state.x2 .x3 ...
问题:很长的调用链带复杂状态的话,很容易污染出bug,代码可维护性下降严重
js
function yourLogic() { var state = {}; return A.func1() .then(function(x1) { state.x1 = x1; return B.func2(x1); }) .then(function(t) { //play with t & state.x1 return yourResult; }); }
bluebird
에 넣으세요.
문제: 긴 호출 체인의 상태가 복잡하면 버그가 오염되기 쉽고 코드의 유지 관리성이 심각하게 저하됩니다
으아아아
bluebird
의 바인딩 메서드는 thisArg에 바인딩될 수 있으며 상태를 유지하는 데 사용될 수 있습니다.으아아아
선택 : 임시추가배송단점: 긴 호출 체인의 각 단계에 상태가 있으면 매우 장황해집니다
으아아아물론 여기의 내부도 직접 캡슐화하여 최적화할 수 있습니다
으아아아 🎜마지막 해결 방법: 폐쇄 유지 관리 상태🎜 🎜사실 이게 원래 질문을 쓰는 방식인데, 질문이 원래의 "콜백 지옥"으로 다시 다운그레이드 되었거나 콜백 피라미드의 당혹스러움이 있다는 점이 가장 큰 문제인 것 같아요🎜 🎜장점은...효과가 있다는 것입니다🎜 으아아아世界只因有你2017-05-15 16:53:30
다음과 같이 then
에서 직접 Promise
객체를 반환합니다. then
里面返回一个 Promise
的对象,如下:
javascript
A.func1() .then(function (x1) { return B.func2(x1); }) .then(function (t) { // do something });
针对你评论中说的问题,如果不使用第三方的 Promise
库的话,可以像下面这样使用:
javascript
var promise = new Promise(function (resolve, reject) { var firstValue; A.func1() .then(function (x1) { firstValue = x1; // 临时保存 return B.func2(x1); }, reject) .then(function (x2) { resolve({ firstValue: firstValue, secondValue: x2 }); }, reject); }); promise.then(function (result) { console.log(result); // {"firstValue": "Hello", "secondValue": "World"} });
使用第三方的 Promise
으아아아
<시간>
Promise
라이브러리를 사용하지 않는 경우 다음과 같이 사용할 수 있습니다. 🎜
으아아아
🎜타사 Promise
라이브러리를 사용하면 이 프로세스를 단순화할 수 있습니다. 🎜过去多啦不再A梦2017-05-15 16:53:30
then의 함수 반환 값이 직접 수량인 경우 다음 체인 호출에서 then의 매개 변수로 사용됩니다.
반환 값에 promise의 인터페이스가 있는 경우 promise의 해결 결과는 다음과 같습니다.
q를 예로 사용