2017-05-04 4 views
1

백엔드 시스템에 대한 동기화 호출을 생성하는 함수가 세 가지 있습니다 (fnOne, fnTwo, fnThree). 나는 올바르게하고 있지 않다는 것을 알고 있지만, 올바른 길을 찾아 낼 수는 없습니다.지연된 약속 - 완료 될 때마다 함수를 하나씩 실행

나는 각이 완료된 후가 그 중 하나를 호출하는 시도하여 오프 시작입니다 :

그러나, fnOne 이미 내부 지연된 개체가 그 문제가 해결 될 때 내 약속을 해결한다.

$.when(oController._fnOne()).done(function(){ 
    console.log("fn one complete"); 
}); 

기능

_fnOne: function(){ 

    var oController = this; 

//when the deferred is done in _checkInstanceStatus, it is resolving the above, rather than the pDeferred in this function resolving the above. 
$.when(oController._checkInstanceStatus(oParams)).done(function(oStatusData) { 
     //does some stuff 
     return $.Deferred(function() { 
      var pDeferred = this; 
      //does a call for data and upon success i will resolve .. 
      pDeferred.resolve(); 
     }); 
    }); 
} 

다른 기능

_checkInstanceStatus: function(oParams){ 
      return $.Deferred(function() { 
       var pDeffered = this; 
       //does a call for data and upon success i will resolve... 
       pDeffered.resolve(data); 

       }); 
      }); 
     }, 

그들과 같이, 하나 하나 실행 있도록 그런 계획이 그들을 시도하고 체인하는 것입니다

$.when(oController._fnOne()) 
.then(oController._fnTwo()) 
.then(oController._fnThree()) 
.done(function(){ 
    console.log("all complete!"); 
}); 
+0

당신에게 고체 대답을 줄 수있는 문제가 확실히 충분한 정보가없는 난 두려워. 'fnOne'이하는 "호출"은 무엇입니까? 그것은 Promise 나 Deferred를 반환하는 것입니까? –

+0

@ T.J.Crowder, 회신 해 주셔서 감사합니다. 호출이 데이터를 위해 백엔드 시스템을 호출하는 곳입니다. 호출이 성공적으로 완료된 후 연기 된 문제를 해결하고 있습니다. pDeferred.resolve(); – neeko

+0

백엔드 시스템에 대한 호출은'$ .ajax'를 통해 이루어 집니까? 다시 : 약속이나 거치를 반환합니까, 아니면 ...? –

답변

3

몇 가지 :

  1. 하나만 전달할 경우 $.when을 사용할 필요가 없습니다.

  2. fnOne (아마도 다른 사람들도) return 약속/지연으로 인해 완료 될 때 알 수 있습니다.

    fnOne: function() { 
        var oController = this; 
        return oController.__checkInstanceStatus(oParams).then(function(oStatusData) { 
         var pDeferred = $.Deferred(); 
         callAmazon(function() { 
          if (/*successful*/) { 
           pDeferred.resolve(); 
          } else { 
           pDeferred.reject(); 
          } 
         }); 
         return pDeferred.promise(); // Or just the Deferred if you like, but 
                // normally you want to share promises, not 
                // Deferred objects 
        }); 
    } 
    

    공지 사항 어떻게 반환then를 호출 한 결과를 :

그래서 fnOne은 다음과 같습니다 그것은이 이연 반환 _checkInstanceStatus을 사용하고 있기 때문에, then 사용하여 그렇게 할 수 있습니다 이것은 then을 호출하여 만들어지는 약속입니다. 이 약속은 then 처리기에서 반환하는 약속에 따라 해결됩니다.

당신은 다른 기능들과 같은 패턴을 따를 것입니다.

체인

다른 후 그들 중 하나, 당신은이 작업을 수행 할 것 :

oController._fnOne() 
.then(oController._fnTwo)  // Notice no() on that, we're passing the 
.then(oController._fnThree)  // function in, not calling it. Same on this line. 
.then(function() { 
    console.log("all complete!"); 
}) 
.catch(function(error) { 
    // Do something about the error 
}); 

(나는 _fnOnefnOne이 같은 기능입니다 있으리라 믿고있어.) 나는 상대적으로 있으리라 믿고있어

Deferreds에서 Promises를 지원하는 jQuery의 최신 버전.


사이드 노트 : 나는 (A polyfill 오래된 브라우저를 지원하기 위해 필요하다면) 기본 약속을 사용하는 대신 사용하도록 전환 할 것 아니라, 그것은 역사와 많이 가지고 ...이 jQuery의 Deferred, API가 번거로워졌습니다.:-)

기본 약속 : (내가 처음 예제에서 이연에 추가 된 약속 API를 사용하기 때문에)

fnOne: function() { 
    var oController = this; 
    return oController.__checkInstanceStatus(oParams).then(function(oStatusData) { 
     return new Promise(function(resolve, reject) { 
      callAmazon(function() { 
       if (/*successful*/) { 
        resolve(); 
       } else { 
        reject(); 
       } 
      }); 
     }); 
    }); 
} 

사용법은 동일합니다.

+1

사과, 일부 오타가 내 부분에 있습니다. 코드를 단순화하려고 시도하는 동안 너무 감사합니다! 네이티브 약속을 너무 바 꾸었습니다. – neeko

+0

마지막 질문이 하나 있습니다 - 한 함수에서 다음 함수로 데이터를 전달하는 방법은 무엇입니까? – neeko

+1

@neeko : 예를 들어'_fnOne'가'resolve ("foo")'를 실행하면'_fnTwo'의 위의 체인을 사용합니다. 첫 번째 매개 변수의 값은 ""foo "'가됩니다. :-) –

2

귀하의 기능을 이해하는 것은 매우 어렵습니다. 그래서 저는 3 개의 다른 func로 3 개의 새로운 func을 정의하는 것을 간단하게 만들었습니다. 그래서 당신은 jquery를 더 쉽게 이해할 수 있습니다.

var funcOne = function() { 
    var defer = $.Deferred(); 
    $.ajax('/echo/json') 
    .then(function(data) { 
     console.log('func1', data); 
     return defer.resolve(data); 
    }); 
    return defer; 
} 

var funcTwo = function() { 
    console.log('begin call func 2'); 
    return $.ajax('/echo/json') 
    .then(function(data) { 
     console.log('func2', data); 
     return $.Deferred().resolve(data); 
    }); 
} 

var funcThree = $.ajax('/echo/json'); 

funcOne() 
    .then(funcTwo) 
    .then(funcThree) 
    .then(function(data) { 
    console.log('finally got func 3 data', data) 
    }); 

jsfiddle 링크 : https://jsfiddle.net/zmjLaznn/