javascript - js循环里有请求服务,如何在success里获取到相应的循序次数值?
迷茫
迷茫 2017-04-11 11:50:28
[JavaScript讨论组]

$http 是angularjs的模块
除了同步以外,还有其他办法做到以下这一点吗? 因为同步效果太慢了。
console.log里面打印的全是10.怎么让它打印0,1,2,3,4,5...以此类推

for(var i=0; i<10; i++){
            $http({
                url : "data.json",
                method : "GET"
            }).success(function(data){
                console.log(i)
            },function(error){
            })
        }
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(4)
高洛峰

是不是可以先动手搜一下。。。

迷茫
function send_http(j){
        $http({
            url : "data.json",
            method : "GET"
        }).success(function(data){
            console.log(j)
        },function(error){
        })
}

for(var i=0; i<10; i++){
    send_http(i);
}

原因是这样的,js发送http请求的时候,是异步的(ajax嘛)。所以你的success处理的回调函数是只有在请求有返回的时候才会被触发。也就是说,浏览器运行这个for循环的时候,只是发送了一个http请求,并不等待请求有返回,就直接i++了。这就导致ajax收到返回数据并触发回调函数的时候,那个for循环早就执行完了,此时的i也已经是10了。所以console.log(i)这个去输出i的值,得到自然都是10。

然后通过建立一个函数,就可以把i的当前值先存到局部变量j里面,然后for循环完了,就会有10个j变量,互不干扰,就可以正常输出了。

天蓬老师

改下写法,原因可以自己找找其他的文章什么的。

for(var i=0; i<10; i++){
    (function(i){
        $http({
            url : "data.json",
            method : "GET"
        }).success(function(data){
            console.log(i)
        },function(error){
        })
    }(i));
}
伊谢尔伦

用let声明i

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号