Javascript:for循环获取数据,但顺序被破坏
我有一个函数,使用for循环通过ajax请求获取页面。这一切都很好,只是页面的顺序常常不正确。我认为这可能是因为循环中的异步函数,但我不知道如何修复它。任何建议都将不胜感激Javascript:for循环获取数据,但顺序被破坏,javascript,ajax,angularjs,loops,Javascript,Ajax,Angularjs,Loops,我有一个函数,使用for循环通过ajax请求获取页面。这一切都很好,只是页面的顺序常常不正确。我认为这可能是因为循环中的异步函数,但我不知道如何修复它。任何建议都将不胜感激 $http.get(link). success(function (data) { var num = parseInt($(data).find('.r.m .l').first().text().split(' ').pop());
$http.get(link).
success(function (data) {
var num = parseInt($(data).find('.r.m .l').first().text().split(' ').pop());
var total = num + 1;
var pages = [];
var query = removeLastPart(link);
for (var i = page; i < total; i++) {
var full = query + "/" + i + ".html";
$http.get(full).
success(function (data) {
pages.push({image: $(data).find('img#image').attr('src')});
j++;
if (i == total) {
cb(pages);
}
}).
error(function () {
console.log("Error getting chapter");
});
}
}).
error(function () {
console.log("Error getting page number");
});
$http.get(链接)。
成功(功能(数据){
var num=parseInt($(数据).find('.r.m.l').first().text().split('.r.m.l'));
var total=num+1;
var页面=[];
var query=removeLastPart(link);
对于(变量i=第页;i<总计;i++){
var full=query+“/”+i+“.html”;
$http.get(完整)。
成功(功能(数据){
push({image:$(data).find('img#image').attr('src')});
j++;
如果(i==总计){
cb(页数);
}
}).
错误(函数(){
日志(“获取错误章节”);
});
}
}).
错误(函数(){
日志(“获取页码时出错”);
});
Ajax的定义是异步的,因此您无法保证返回的顺序。您可以做的是,在返回enter数据集后,您可以自己对数组进行排序。Ajax的定义是异步的,因此您无法保证返回的顺序。您可以做的是,在返回enter数据集后,您可以自己对数组进行排序。也许您可以使用$q。总之,结果将按照调用的相同顺序返回,而不管实际返回的是哪一个
也许您可以使用$q.all,结果将按调用顺序返回,而不管哪一个实际首先返回
由于异步调用,您的请求可能会按顺序执行,因此您是正确的。您可以通过使用IIFE或将ajax调用移动到单独的函数并传递页面应加载到的索引来解决这一问题 生活
您是正确的,因为异步调用您的请求可能会按顺序执行。您可以通过使用IIFE或将ajax调用移动到单独的函数并传递页面应加载到的索引来解决这一问题 生活
响应顺序将与已排序的数据不同@如果是的话,他就不需要排序了。@PatrickMotard:OP不需要排序的响应。响应应按请求的顺序提供!在所有ajax调用完成后对响应进行排序不会使数组按请求的顺序排列,而是按值的顺序排列数据!这个解决方案不正确,他没有说他将如何分类。因为他知道自己的数据没有按顺序排列,这意味着OP知道他希望数据按哪个顺序排列,因此他可以相应地对它们进行排序。响应的顺序将与排序后的数据不同@如果是的话,他就不需要排序了。@PatrickMotard:OP不需要排序的响应。响应应按请求的顺序提供!在所有ajax调用完成后对响应进行排序不会使数组按请求的顺序排列,而是按值的顺序排列数据!这个解决方案不正确,他没有说他将如何分类。因为他知道自己的数据没有按顺序排列,这意味着OP知道他希望数据按哪个顺序排列,因此他可以相应地对数据进行排序。不要将数据推入
页面
数组。你已经知道会有多少页。只需将正确的页面分配给正确的索引即可pages[i]={image:…
而不是pages.push()
EDIT:参见@Patrick Evans的答案。您还需要向parseInt
传递两个参数:要解析的值和基数。如果没有基数,它将尝试猜测文本所指的基数!parseInt(“0x10”)
变为16
,因为我认为是十六进制而不是10
/错误。旧浏览器有时也会使用八进制。始终添加基数10。关于我之前的评论,您应该使用类似jshint的工具来捕捉这些常见的javascript问题,以避免将来的麻烦。IIRC,它还将捕捉到Patrick Evans谈到(通过使用IIFE修复)。不要推入页面
数组。您已经知道将进入多少页面。只需将正确的页面分配到正确的索引。页面[i]={image:…
而不是页面。push()
EDIT:参见@Patrick Evans的答案。您还需要将两个参数传递给parseInt
:要解析的值和基数
。如果没有基数,它将尝试猜测文本所指的基数!parseInt(“0x10”)
变为16
,因为我认为是十六进制而不是10
/错误。旧浏览器有时也会使用八进制。始终添加基数10。关于我之前的评论,您应该使用类似jshint的工具来捕捉这些常见的javascript问题,以避免将来的麻烦。IIRC,它还将捕捉到Patrick Evans谈到(通过使用iLife修复)。如果我们要使用$q.all,我们可能希望直接修改它的结果,而不是手动将结果逐个插入pageArray。这样,我们甚至不必担心传递索引/数组,代码更清晰。下面是一个示例:如果我们要使用$q.all,我们可能希望直接修改它的结果手动将结果一个接一个地插入pageArray,这样我们就不必担心传递索引/数组,代码就更清晰了。下面是一个示例:
for (var i = page; i < total; i++) {
var full = query + "/" + i + ".html";
(function(idx){
$http.get(full).
success(function (data) {
pages[idx] = {image: $(data).find('img#image').attr('src')};
j++;
//assuming j is a counter for knowing when pages are loaded
if (j == total) {
cb(pages);
}
}).
error(function () {
console.log("Error getting chapter");
});
})(i);
}
function doAjax(url,pageArray,idx,cb){
$http.get(url).
success(function (data) {
pageArray[idx] = {image: $(data).find('img#image').attr('src')};
j++;
//assuming j is a counter for knowing when pages are loaded
if (j == total) {
cb(pages);
}
}).
error(function () {
console.log("Error getting chapter");
});
}
//....
for (var i = page; i < total; i++) {
var full = query + "/" + i + ".html";
doAjax(full,pages,i,cb);
}
function doAjax(url,pageArray,idx){
return $http.get(url).
success(function (data) {
pageArray[idx] = {image: $(data).find('img#image').attr('src')};
}).
error(function () {
console.log("Error getting chapter");
});
}
//....
var ajaxCalls = [];
for (var i = page; i < total; i++) {
var full = query + "/" + i + ".html";
ajaxCalls.push( doAjax(full,pages,i) );
}
$q.all(ajaxCalls).then(function(){
cb(pages);
});