用于循环的can'不要等待
A for cycle can't wait
如何强制循环在运行之前等待每个XHR完成?我知道一种方法是在评论中,但它扼杀了百分比计数器的实时性。
var data = new Array, per = 0;
WinJS.xhr({url : "http://index.hu/tech/rss"}).done(function(req){
$($.parseXML(req.response)).find("item title:lt(5)").each(function() {
data.push({
h : this.textContent
})
}).next().each(function(ind) {
WinJS.xhr({
url : this.textContent
}).done(function(req) {
per += 100 / 30;
$("#per").text(Math.ceil(per) + " %");
data[ind].p = req.response.match(/<p>(.+?)<'/p>/)[1]
})
/*var req = new XMLHttpRequest;
req.open("get", this.textContent, false);
req.onreadystatechange = function()
{
if(this.readyState == 4)
{
per += 100/30;
$("#per").text(Math.ceil(per) + " %");
data[ind].p = this.response.match(/<p>(.+?)<'/p>/)[1]
}
}
req.send()*/
})
for(var ind in data)
{
//console.log(data[ind].p)
}
})
您可以在XHR请求上附加一个回调函数,检查是否满足for循环的停止条件,然后停止,或者再次进行请求,而不是使用for循环。
您可以使用setTimeout
等待。参见下面的setTimeOut(wheAllDone, 100);
行:
var items = $($.parseXML(req.response)).find("item title:lt(5)").each(function()
{
data.push(
{
h : this.textContent
})
}).next();
var itemsCount = items.length;
var doneSoFarCount = 0;
items.each(function(ind)
{
WinJS.xhr(
{
url : this.textContent
}).done(function(req)
{
per += 100 / 30;
$("#per").text(Math.ceil(per) + " %");
data[ind].p = req.response.match(/<p>(.+?)<'/p>/)[1]
doneSoFarCount ++;
})
});
var wheAllDone = null;
wheAllDone = function() {
if(doneSoFarCount >= itemsCount)
{
for(var ind in data)
{
//console.log(data[ind].p)
}
} else {
setTimeOut(wheAllDone, 100); // <<<<< Wait a bit for all to complete
}
};
相关文章:
- Javascript在for循环中等待处理请求
- JavaScript循环并等待函数
- 在等待异步任务时永久循环
- 等待循环调用的所有承诺完成
- 如何让foreach循环等待$http.get完成后再继续
- 如何使for循环等待回调返回值
- 在 JS 中使 for 循环在没有库的情况下等待
- Nodejs async.each 等待第一个循环
- 如何在数组中循环,等待每个项目之间的时间
- 如何在for循环中等待一个,直到ajax调用完成
- NodeJS - Bluebird:等待循环完成
- 等待循环中的函数完成
- 等待循环完成
- 使异步/等待循环按顺序执行
- 在输出数据之前,等待循环完成每个数组项的 $.getJSON
- Jquery等待循环中带有ajax调用的函数完成-单击按钮后刷新
- 等待循环结束并执行第二个函数
- 如何等待'等待'循环返回
- 如何在退出循环之前等待循环内的异步进程完成
- Javascript:等待循环中的函数在下一次迭代之前完成执行