Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:for循环获取数据,但顺序被破坏_Javascript_Ajax_Angularjs_Loops - Fatal编程技术网

Javascript:for循环获取数据,但顺序被破坏

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());

我有一个函数,使用for循环通过ajax请求获取页面。这一切都很好,只是页面的顺序常常不正确。我认为这可能是因为循环中的异步函数,但我不知道如何修复它。任何建议都将不胜感激

$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);
 });