$ .when使用动态输入参数和参数

时间:2016-10-24 10:52:04

标签: jquery ajax

我有一个池,我存储数据,并循环遍历项目。

限制是3,所以我得到第一个物品,第二个物品和其余物品。

ajax.php等待来自池阵列的秒数。因此,第一个周期1,2,4应该在4秒后释放,第二个周期2,1,4也会4秒,剩余的3,13

问题在于$.when即时获取ajax调用,即使它没有responseText。我试图添加.apply但在这种情况下我的浏览器正在冻结......

它将所有请求记录为对象,但没有responseText。当4秒钟时,4秒后响应文本附加到它。

我该如何解决这个问题?

var queue = {
    limit: 3,
    pool: [
       1, 2, 4, 
       2, 1, 4, 
       3, 1
    ]
};


function startAjaxRequests() {
    var requests = [];
    while (queue.pool.length > 0) {
        for (var i = 0; i < queue.limit; i++) {
            if (typeof queue.pool[i] !== 'undefined') {
                requests.push($.get('/ajax.php', {secs: queue.pool[i]}, function () {}));
            }
        }
        $.when($, requests).done(function () {
        //$.when.apply(null, requests).done(function () {
            $.each(arguments, function (key, value) {
                console.log(value);
            });
            queue.pool.splice(0, queue.limit);
            requests = [];
        });
    }
    console.log('finish...');
}

startAjaxRequests();

如果我这样使用:

var a1 = $.get('/ajax.php', {secs: 1});
var a2 = $.get('/ajax.php', {secs: 2});
var a3 = $.get('/ajax.php', {secs: 4});
$.when(a1, a2, a3).done(function () {
    $.each(arguments, function (key, value) {
        console.log(value);
    });
});

然后它可以正常工作,并在4秒后控制结果。

2 个答案:

答案 0 :(得分:1)

  

我试图添加.apply

这是正确的。

  

但在这种情况下我的浏览器正在冻结...

这是因为你的while循环。 Ajax(和$.when)正在调用你的回调异步,所以你已经在你的池清空之前进入了下一次迭代 - 这实际上是一个无限循环。使用异步代码,您需要使用递归方法而不是同步循环。

function startAjaxRequests() {
    if (queue.pool.length > 0) {
        var requests = [];
        for (var i = 0; i < queue.limit; i++) {
            if (typeof queue.pool[i] !== 'undefined') {
                requests.push($.get('/ajax.php', {secs: queue.pool[i]}));
            }
        }
        $.when.apply($, requests).then(function () {
            $.each(arguments, function (key, value) {
                console.log(value);
            });
            queue.pool.splice(0, queue.limit);
            startAjaxRequests(); // recurse!
        });
    } else {
        console.log('finish...');
    }
}

答案 1 :(得分:0)

$.when是异步调用,在调用第二个服务请求之前,您的队列可能为空。