2

可変数のajaxリクエストがある場合、遅延を使用してそれらを呼び出すにはどうすればよいですか?

私の推測:

//qty_of_gets = 3;

function getHTML(productID, qty_of_gets){

    var dfd = $.Deferred(),
            i = 0,
            c = 0;

    //this is where there could be some magic to 
    //do multiple ajax posts
    //obviously I'm out of my depth here...
    while (i <= qty_of_gets){

        dfd.pipe(function(){
            $.get("queries/html/" + product_id + i + ".php");
        });                       
    i++
    }
    dfd.done(function(){

        while (c <= qty_of_gets){
           $('myDiv').append(c);
           c++;
        }

    });
}
4

2 に答える 2

6

Ajax呼び出しを順番に実行する場合は、コールバックからpromiseを返し、最後のpromiseオブジェクトに新しいコールバックをアタッチする必要があります。

var dfd = $.Deferred(),
   promise = dfd.promise(),
   i = 0,
   c = 0;

while (i <= qty_of_gets) {
    // needs an IIFE
    (function(i)
        promise = promise.then(function(){
            return $.get("queries/html/" + product_id + i + ".php");
        });
    }(i++));                       

}

promise.done(function(){

    while (c <= qty_of_gets){
       $('myDiv').append(c);
       c++;
    }

});

// resolve deferred
dfd.resolve();

jQuery 1.8以降では、.thenの代わりにを使用する必要があり.pipeます。

もう1つの問題は、(少なくともあなたの例では)コールバックが実行された時点で、i期待する値が得られないことです。すぐに呼び出される関数式を使用して、の現在の値を取得できますi。詳細については、ループ内のJavaScriptクロージャ–簡単な実用例を参照してください。


結果を得るためのクリーンな解決策はありません。.done結果を配列に追加し、コールバックでその配列にアクセスするのが最善の方法だと思います。すなわち:

var results = [];

while (i <= qty_of_gets) {
    // needs an IIFE
    (function(i)
        promise = promise.then(function(){
            return $.get("queries/html/" + product_id + i + ".php")
                     .then(function(result) {
                       results[i] = result;
                     });
        });
    }(i++));                       

}

promise.done(function(){
    // do something with `results`
});
于 2013-02-20T21:15:19.450 に答える
3

閉じる、.pipeコールバックからpromiseオブジェクトを返す必要があります。
フェリックスの答えを参照してください。次のサンプルには、返品がないだけでなく、追加の問題があります。

dfd.pipe(function(){
    return $.get("queries/html/" + product_id + i + ".php");
});  

また、実際にはまだどこにも書かれていないと思いますが .pipe、最近のバージョンではコアに次のように実装されています。

promise.pipe = promise.then

したがって、リファレンスに置き換える必要が あります: http: //api.jquery.com/deferred.pipe/dfd.pipedfd.then

adeneoが述べたように、別の方法は使用することです$.when

function getHTML(productID, qty_of_gets) {

    var dfdArr = [];

    while (i <= qty_of_gets) {
        dfdArr.push($.get("queries/html/" + product_id + i + ".php"));
        i++
    }
    $.when.apply(null, dfdArr).done(function () {

        for (response in arguments) {
            $('#myDiv').append(response[0]);
        }

    });
}
于 2013-02-20T20:52:02.853 に答える