angular.js - 怎么写promise的链式调用
高洛峰
高洛峰 2017-05-15 16:51:30
0
4
505

比如我有一个A.func1()是异步的,它能返回一个对象x1,我还有一个B.func2()也是异步的,需要根据x1来执行,然后B.func2返回一个最终值值t,根据这个最终值t就进行一些提示性显示。请问这个要怎么写呢?
我自己写的代码是这样的

A.func1().
    then(function(x1) {
        B.func2(x1).
            then(function(t) {
                //do something
            })
    })

但是感觉这样用不用then就一个效果啦……还是变回金字塔了

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

모든 응답(4)
世界只因有你

"Promise 연속 호출 중 상태 저장"에 대한 댓글의 보충 댓글에 대해 몇 가지 전략을 자세히 설명하고 싶습니다

최고의 전략: De-statement

즉, 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에 넣으세요.

중앙 전략: "전역" 변수가 상태를 유지합니다

장점: 상태를 확장할 수 있음 state.x2 .x3...

문제: 긴 호출 체인의 상태가 복잡하면 버그가 오염되기 쉽고 코드의 유지 관리성이 심각하게 저하됩니다
으아아아

bluebird의 바인딩 메서드는 thisArg에 바인딩될 수 있으며 상태를 유지하는 데 사용될 수 있습니다.

으아아아

선택 : 임시추가배송

장점: 상태가 없으면 호출 체인이 길면 이 추가 상태가 두 단계 사이에서 제어되어 더 나은 유지 관리성을 유지하고 버그 발생 가능성이 줄어듭니다

단점: 긴 호출 체인의 각 단계에 상태가 있으면 매우 장황해집니다

으아아아

물론 여기의 내부도 직접 캡슐화하여 최적화할 수 있습니다

으아아아 🎜마지막 해결 방법: 폐쇄 유지 관리 상태🎜 🎜사실 이게 원래 질문을 쓰는 방식인데, 질문이 원래의 "콜백 지옥"으로 다시 다운그레이드 되었거나 콜백 피라미드의 당혹스러움이 있다는 점이 가장 큰 문제인 것 같아요🎜 🎜장점은...효과가 있다는 것입니다🎜 으아아아
世界只因有你

다음과 같이 then에서 직접 Promise 객체를 반환합니다. then 里面返回一个 Promise 的对象,如下:

javascript
A.func1() .then(function (x1) { return B.func2(x1); }) .then(function (t) { // do something });

针对你评论中说的问题,如果不使用第三方的 Promise 库的话,可以像下面这样使用:

javascriptvar 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 라이브러리를 사용하면 이 프로세스를 단순화할 수 있습니다. 🎜
巴扎黑

promise는 Promise 객체를 반환하므로 우아한 연쇄 호출을 사용할 수 있습니다.

过去多啦不再A梦

then의 함수 반환 값이 직접 수량인 경우 다음 체인 호출에서 then의 매개 변수로 사용됩니다.
반환 값에 promise의 인터페이스가 있는 경우 promise의 해결 결과는 다음과 같습니다.
q를 예로 사용

으아악
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿