0

これを行う最も良い方法は何だろうと思っていました:

2 つの ajax リクエストがあり、2 番目のリクエストには最初の結果が必要です。

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);

したがって、明らかに、 の 2 番目の呼び出しからのみ結果が得られdoSomethingWithBothResultsます。両方の結果を得るためにこれをうまく書き直す方法はありますか?

4

4 に答える 4

4

以下のコードは、両方のクエリが完了した場合にのみ、両方の結果が渡される3 番目の遅延オブジェクトを使用する方法を示しています。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

success2 番目の関数を最初の の関数として定義するだけ.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 に答える