使用jquery deferreds为Ajax请求的数量变化(use jquery deferred

2019-07-20 06:30发布

当我有可变数量的Ajax请求的,我怎么能叫他们用deferreds?

我猜:

//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++;
        }

    });
}

Answer 1:

如果你想执行Ajax调用顺序,你必须从回调返回的承诺,还附上了新的回调到最后承诺对象:

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

另一个问题是(在你的例子至少),当时的回调执行, 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`
});


Answer 2:

关闭,你需要从返回一个承诺对象.pipe回调。
见Felix的答案,接下来的样品已经不仅仅是恢复丢失的其他问题。

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

另外,我不认为它实际上是书面的任何地方还,但 .pipe是在最新版本的内核中实现这样的:

promise.pipe = promise.then

因此,你可以应更换dfd.pipedfd.then
参考: http://api.jquery.com/deferred.pipe/

作为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]);
        }

    });
}


文章来源: use jquery deferreds for variable number of ajax requests