我想知道最好的方法是什么:
我有两个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
中的第二次调用中得到结果。有没有什么方法可以很好地重写这两个结果?
下面的代码显示了如何使用第三个延迟对象,该对象在两个查询完成后仅为resolved
,并传递both的结果。
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
});
只需将第二个函数定义为第一个.getJSON
的success
函数。
然而,将所有数据放在服务器上的单个文件中不是更简单吗?更少的调用意味着更快、更干净的代码(通常)。
编辑:
试试这把小提琴。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);});
很抱歉把要求弄错了,我想没有正确阅读。
顺便说一句,我更喜欢@Alnitak的答案,尽管我的答案也有效:)
您也应该将功能放在发布ajax调用的控制器中。这是一种更干净的方式,也是更好的练习。