Sno*_*bie 13 javascript angularjs
我想知道是否可以使用while或for使用嵌套调用$http.get:
这是一个例子:
for (var i = 0; i < $scope.comments.length; i++) {
alert($scope.comments[i].id); // = 2
$http.get('/api/logged/like/isliked?id=' + $scope.comments[i].id).success(function(data, status, header, config) {
alert('Test');
alert($scope.comments[i].id); // Not executed.
}).error(function(data){alert('The requeste isn't working');}); }
Run Code Online (Sandbox Code Playgroud)
我把两个alerts显示我用来检索JSON的评论的ID.我得到第一个警报的id,然后第二个警告"测试",但第三个警报没有显示.为什么不?
这是JSON的一个例子:
{数据 ":[{" ID ":2 "is_liked":假" nb_comments ":1," nb_likes ":1," date_creation ":" 2014-05-26T17:03:54 + 0000" },{ "ID":1, "is_liked":真 "nb_comments":0 "nb_likes":1, "date_creation": "2014-05-26T17:00:26 + 0000"}]}
Mar*_*ine 32
问题:
不要在循环中创建函数 ......
函数的每次调用实际上都是引用i内存中的相同副本.每次for循环运行时都会创建一个新的闭包,但每个闭包捕获相同的环境.因此,每次调用$http.get(异步函数)都会导致引用从循环结束引用相同最终值的回调i.
一个办法:
传递i作为参数来单独定义的函数:
var getIsLiked = function(i){
$http.get('isliked.json' + $scope.comments[i].id)
.success(function(data) {
console.log('Test');
console.log('i is ', i);
console.log($scope.comments[i].id);
}).error(function(data){console.log("The request isn't working");}); }
}
for (var i = 0; i < $scope.comments.length; i++) {
getIsLiked(i);
}
Run Code Online (Sandbox Code Playgroud)
这可能真的难以理解,但是值得深入了解.它不仅可以帮助您避免将来出现类似问题,还可以让您更好地理解闭包,这是JavaScript中的一个重要概念.
| 归档时间: |
|
| 查看次数: |
13127 次 |
| 最近记录: |