2012-03-23 20 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); 

我在這裏丟失了什麼?

- 編輯 -

如果我在兩個延期調用打破它們,它的工作原理,但隨後有什麼用鏈接和管的?

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

--Correct方式做this--

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就在你的示例代碼,錯字? (應該是回叫,而不是駝峯式的callBack) – 2012-03-26 15:26:55

+0

是的。它是一個錯字。 – Asdfg 2012-03-26 15:50:53

回答

0

你應該寫pipe(getCall2),不pipe(getCall2())deferred.pipe()期望回調返回延期,而不是延期本身。這是有道理的,因爲關鍵要求是鏈接請求(即只在第一個Ajax調用完成後才啓動第二個Ajax調用),並且只有在您開始操作後纔會得到延遲。

+0

nope。那不是問題,但如果我改變它,它不會做預期。但我已經知道了。我會發布答案。 – Asdfg 2012-03-26 15:47:57

+0

不確定你期望的是什麼,但是它會按照你的要求(第二次回調從第二次Ajax調用獲得結果):http://jsfiddle.net/qeqkg/1/ – Tgr 2012-03-27 19:22:25

0

我在你的代碼中理解的是,如果getCall1成功,你只想致電getCall2

所以你的代碼似乎很好。我試圖在的jsfiddle(用更簡單的例子),它爲我的偉大工程:

http://jsfiddle.net/PG3aN/

也許這是一個愚蠢的問題,但你肯定getCall1和getCall2不應該簡單地返回服務器的結果相同嗎?這可以解釋爲什麼你在回調中得到1相同的數據和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 2012-03-30 19:44:22

+0

你確定這個問題不在你的第二個Ajax調用中嗎?我們已經嘗試過使用順序管道的例子,但沒有問題。調用管道(e){return e; }就像無所事事。所以我不知道如何才能解決問題。 見[jQuery的管文檔中的 「鏈任務」 示例](http://api.jquery.com/deferred.pipe/)。它使用ajax - > pipe - > ajax - > done,這與您的需求非常相似。 – Mordhak 2012-03-30 21:02:21

+0

我相信這是工作,我也想爲顯示在第二個片段 – Asdfg 2012-03-30 21:12:35