使用jquery的雪球数据延迟



我想知道最好的方法是什么:

我有两个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
});

只需将第二个函数定义为第一个.getJSONsuccess函数。

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

编辑:

试试这把小提琴。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调用的控制器中。这是一种更干净的方式,也是更好的练习。

最新更新