2012-07-17 55 views
0

我想知道這樣做的最好的方法是:雪球數據推遲

我有兩個AJAX請求第二個請求需要第一的結果。

我正試圖找到一個很好的方式來獲得兩個結果到doSomethingWithBothResults函數。

var getValue1 = function(){ return $.getJSON('/getVal1'); } 
var getValue2 = function(result){ return $.getJSON('/getVal2'+ result.data); } 
var doSomethingWithBothResults = function(result1, result2) { alert('r1:' + result1.data + 'r2:' + result2.data); }; 

getValue1.pipe(getValue2).then(doSomethingWithBothResults); 

所以很明顯,我只能從doSomethingWithBothResults的第二個電話獲得結果。有什麼方法可以很好地重寫這兩個結果?

回答

4

下面的代碼演示瞭如何使用第三延遲對象,它是唯一resolved一旦這兩個查詢是完整的,並且是通過了的結果

var d = $.Deferred(); 

$.ajax(...).done(function(data1) { 
    // use data1 to initiate the second request 
    ... 

    $.ajax(...).done(function(data2) { 
     d.resolve(data1, data2); 
    }).fail(d.reject); 

}).fail(d.reject); 

d.done(function(data1, data2) { 
    // do something with both 
}); 
0

你應該把功能放在你發佈ajax調用的控制器上。這是一種更清潔的方式,更好的練習。

2

只需限定第二函數作爲函數success用於第一.getJSON

但是,將所有數據放入服務器上的單個文件不是更簡單嗎?更少的調用意味着更快更簡潔的代碼(通常)。

1

編輯:

試試這個小提琴。 http://jsfiddle.net/ztH6L/1/

var chain = function (opt1, opt2, cb) { 
    var r1, r2; 
    $.ajax(opt1) 
     .done(function (r) { r1 = r; }) 
     .pipe(function (r) { opt2.data = {json: JSON.stringify({"v": r})}; return $.ajax(opt2);}) 
     .done(function (r) { r2 = r;}) 
     .pipe(function() {cb(r1, r2);}); 
}; 

var opt1 = { 
    url: '/echo/json/', 
    data: {json: JSON.stringify({"v": 1})}, 
    dataType: 'json', 
    type: 'POST' 
}; 


var opt2 = { 
    url: '/echo/json/', 
    dataType: 'json', 
    type: 'POST' 
}; 

chain(opt1, opt2, function(r1, r2) {console.log(r1); console.log(r2);}); 

對不起,要求錯誤,猜測沒有正確閱讀。

順便說一句,我喜歡@參宿一的回答更好,雖然我的也適用:)

+0

這幾乎是我後,唯一的問題是第二次調用依賴於第一次調用返回的值,所以這將無法正常工作。 – 2012-07-17 13:03:34