찾다

 >  Q&A  >  본문

angular.js - Promise 체인 호출을 작성하는 방법

예를 들어, 비동기식 A.func1()이 있고 x1 객체를 반환할 수 있습니다. 또한 비동기식이며 x1을 기반으로 실행해야 하는 B.func2()도 있고 그 다음에는 B가 있습니다. .func2는 최종 값 t를 반환하며, 이 최종 값 t를 기반으로 일부 프롬프트 표시가 수행됩니다. 이건 어떻게 써야 하나요?
제가 직접 작성한 코드는 이렇습니다

으아악

그런데 사용하든 안하든 효과는 똑같은거같은데...역시 피라미드로 돌아갑니다

高洛峰高洛峰2786일 전550

모든 응답(4)나는 대답할 것이다

  • 世界只因有你

    世界只因有你2017-05-15 16:53:30

    "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에 바인딩될 수 있으며 상태를 유지하는 데 사용될 수 있습니다.

    으아아아

    선택 : 임시추가배송

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

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

    으아아아

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

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

    회신하다
    0
  • 世界只因有你

    世界只因有你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 库的话,可以像下面这样使用:

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

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-05-15 16:53:30

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

    회신하다
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-15 16:53:30

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

    으아악

    회신하다
    0
  • 취소회신하다