2012-03-23 2 views
4

지연된 파이프를 사용하여 콜백을 체인화하는 데 어려움을 겪고 있습니다. 잘 작동하는 것처럼 보이지만 콜백 2에서는 콜백 1에서 데이터를 가져옵니다. 다음은 코드의 모양입니다.지연된 파이프와 파이프를 사용하는 체인 콜백

var getCall1 = function() { 
    return $.ajax(url, { 
     type: "GET", 
     data: { }, 
     contentType: "application/json", 
     dataType: "json" 
    }); 
} 


var getCall2 = function() { 
    return $.ajax(url, { 
     type: "GET", 
     data: {}, 
     contentType: "application/json", 
     dataType: "json" 
    }); 
} 

var callback1 = function (data) 
      { 
       alert('call 1 completed'); 
      }; 

var callback2 = function (data) 
      { 
       alert('call 2 completed'); 
      }; 

$.when(getCall1()).done(callBack1).pipe(getCall2()).done(callBack2); 

무엇이 여기에 있습니까?

--Edit--

내가이 연기 호출에 그들을 깰 경우, 그것은하지만 작동 뭐죠 체인 및 파이프의 사용?

$.when(getCall1()).done(callBack1); 
$.when(getCall2()).done(callBack2); 

--Correct 방법은이 항아리

var getCall1 = function() { 
    return $.ajax(url, { 
     type: "GET", 
     data: { }, 
     contentType: "application/json", 
     dataType: "json" 
    }); 
}.pipe(function (d){return d}); 


var getCall2 = function() { 
    return $.ajax(url, { 
     type: "GET", 
     data: {}, 
     contentType: "application/json", 
     dataType: "json" 
    }); 
}.pipe(function (d){return d}); 

var callback1 = function (data) 
      { 
       alert('call 1 completed'); 
      }; 

var callback2 = function (data) 
      { 
       alert('call 2 completed'); 
      }; 

     $.when(getCall1, getCall2).done(function(d1, d2){ 
      callback1(d1); 
      callback2(d2); 

     }); 
+0

로 새로운 jsFiddle은 샘플 코드에 그 오타인가? (낙타 사례 콜백 대신 콜백이어야 함) –

+0

예. 그 오타. – Asdfg

답변

0

당신은 pipe(getCall2)하지 pipe(getCall2()) 작성해야 할 수 있습니다. deferred.pipe()은 지연된 자체를 반환하는 콜백을 기대합니다. 첫 번째 요청이 완료된 후 두 번째 아약스 호출을 시작하는 것과 같이 요청을 연결하는 것이 중요하며 사용자가 작업을 시작한 후에 만 ​​지연을받습니다. 내가 코드에서 이해 무엇

+0

nope. 그게 문제가 아니지만 그래도 내가 그것을 바꿀 경우, 그것은 예상하지 않습니다. 그러나 나는 그것을 알아 냈다. 나는 대답을 게시 할 것이다. – Asdfg

+0

예상하지만, 당신이 무엇을 요구하지 않습니다 있는지 무엇을 (두 번째 콜백이 두 번째 아약스 호출에서 결과를 얻을 수) : http://jsfiddle.net/qeqkg/1/ – Tgr

0

getCall1가 successed 경우에만 getCall2를 호출 할 수 있습니다.

코드가 좋을 것 같습니다. 나는 jsFiddle에서 그것을 시도 (더 간단한 예와)과 나를 위해 잘 작동합니다 :

http://jsfiddle.net/PG3aN/

는 어쩌면 바보 같은 질문이지만 당신에게 getCall1 및 getCall2 단순히 반환하지해야한다는 확신 서버에서와 동일한 결과가 나타 납니까? 당신이 콜백 일에 동일한 데이터를 얻을 2.

다른 질문은, 마지막 코드 샘플에서, 당신이 쓰는 이유는 설명 할 수

var getCall1 = function() { 
return $.ajax(url, { 
     type: "GET", 
     data: { }, 
     contentType: "application/json", 
     dataType: "json" 
    }); 
}.pipe(function (d){return d}); 

코드의 행동에 마지막 파이프 변경 일을합니까?

그리고 마지막 코드 샘플에 대한 마지막 말은, 예상되는 결과는 동일하지 않습니다. 이 코드에서는 getCall1과 getCall2가 모두 성공한 경우에만 callback1과 callback2를 호출 할 것이라고 썼습니다. 첫 번째 코드와 동일한 동작이 아닙니다.

편집 : 실제 비동기 결과

http://jsfiddle.net/PG3aN/1/

+0

글쎄, 당신이 볼 수있는 마지막 조각은 내가 알아 낸 해결책은 . 만약 내가 그것을 사용하지 않으면, 그것은 나에게 콜백 모두에서 첫 번째 응답을 반환합니다. – Asdfg

+0

두 번째 ajax 호출에서 문제가 발생하지 않았습니까? 우리는 문제가없는 순차적 파이프를 사용하여 예제를 시도했습니다.콜링 파이프 (e) {리턴 e; } 아무것도하지 않는 것과 같습니다. 그래서 나는 그것이 해결책 일 수있는 방법을 모른다. [ "jQuery pipe documentation의"chain tasks "예제] (http://api.jquery.com/deferred.pipe/)를 참조하십시오. 그것은 ajax -> pipe -> ajax -> done을 사용하는데, 이것은 여러분의 필요와 정말로 비슷합니다. – Mordhak

+0

두 번째 스 니펫에 표시된 코드로 바꾼 후에 코드가 제대로 작동하고 있다고 확신합니다. – Asdfg

관련 문제