4

次の問題-ajax関数を何度も呼び出さなければならず、すべての関数が完了したら、すべての結果を配列に入れます。私はこれを思いついた:

function doAjax(xx){
var xdata = {json: $.toJSON({name: xx}),
            delay: 1};
return $.ajax({
    url:"/echo/json/",
    data:xdata,
    type:"POST"
});

}

var carr = [doAjax('a'),doAjax('b'),doAjax('c'),doAjax('d')]
var result = [];

$.when( carr )
    .done(function(data){
        console.log(data);
        $.each(data, function(ix,val){
            console.log(val.name);
        });
    });

ここでフィドル:http://jsfiddle.net/Fkd9n/

すべて正常に機能しているようです。「console.log(data)」は応答テキストを使用してオブジェクトを書き出しますが、「console.log(val.name)」は常に「未定義」です。では、すべての呼び出しが完了したら、すべての結果を1つの配列に結合するにはどうすればよいでしょうか。

ありがとうございました!

4

2 に答える 2

8

Ajax呼び出しの数がわかっている場合は、$。when()を使用するだけです。

$.when(doAjax('a'),doAjax('b'),doAjax('c'),doAjax('d'))
.then(function(result_a,result_b,result_c,result_d) {
    console.log("Result from query a: " + result_a);
    console.log("Result from query b: " + result_b);
    console.log("Result from query c: " + result_c);
    console.log("Result from query d: " + result_d);
});

ajax呼び出しの数がわからない場合は、遅延オブジェクトを自分で管理できます。

// altered version of doAjax()
function doAjax(number,dObject) {
    var xdata = {json: $.toJSON({name: number}), delay: 1};
    $.ajax({
        url:"/echo/json/",
        data:xdata,
        type:"POST",
        success: function(data) {
            results.push(data);
            dObject.resolve();
        }
    });
}

// array that will contain all deferred objects
var deferreds = [];

// array that will contain all results
var results = [];

// make the ajax calls
for (var i = 0; i < someNumber; i++) {
    var dObject = new $.Deferred();
    deferreds.push(dObject);
    doAjax(i,dObject);
}

// check if all ajax calls have finished
$.when.apply($, deferreds).done(function() {
    console.log(results);
});

魔法には、関数の引数に配列を作成する関数apply()が付属しています。

于 2012-12-17T11:15:49.783 に答える
4

関数を使用pipeして、結果のデータを処理できます。

$.when.apply($, carr).pipe(function(){
    console.log(arguments);
    return $.map(arguments, function(item){return item[0]});
})
    .done(function(data){
        console.log(data);
        $.each(data, function(ix,val){
            console.log(val.name);
        });
    });​

http://jsfiddle.net/Fkd9n/6/

于 2012-12-17T11:08:33.523 に答える