我有一个池,我存储数据,并循环遍历项目。
限制是3,所以我得到第一个物品,第二个物品和其余物品。
ajax.php
等待来自池阵列的秒数。因此,第一个周期1,2,4
应该在4
秒后释放,第二个周期2,1,4
也会4
秒,剩余的3,1
是3
秒
问题在于$.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秒后控制结果。
答案 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
是异步调用,在调用第二个服务请求之前,您的队列可能为空。