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

4 回答 4

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
});
于 2012-07-17T13:20:10.870 回答
2

只需将第二个函数定义为第success一个函数.getJSON

但是,将所有这些数据放在服务器上的单个文件中不是更简单吗?更少的调用意味着更快和更干净的代码(通常)。

于 2012-07-17T12:52:22.370 回答
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);});

很抱歉弄错了要求,猜测没有正确阅读。

顺便说一句,我更喜欢@Alnitak 的回答,虽然我的也可以:)

于 2012-07-17T13:01:39.380 回答
0

您也应该将功能放在发布 ajax 调用的控制器中。这是一种更清洁的方式,也是更好的做法。

于 2012-07-17T12:52:10.630 回答