为什么$ http的回调不知道自身之外的变量?

时间:2014-03-04 00:30:45

标签: javascript angularjs

比如说我有以下代码:

for(var i=0; i < itemlist.length; i++){
    var item = itemlist[i];
    var id = item.id;
    $http.get(id + '.json').success(function(data){
        //do something with data.
        console.log(item.name);
    }
}

控制台中显示的名称将是重复值(我认为数组项目列表中的第一个值),即回调函数不知道变量项。

根据我的理解水平,这是奇怪的。有没有办法将额外的变量传递给这个回调函数 - 和/或 - 有人可以告诉我为什么这个变量的范围以这种方式运行?

2 个答案:

答案 0 :(得分:2)

假设itemlist是一个数组,您可以使用angular.forEach()之类的

angular.forEach‎ (itemlist, function (item, i) {
    var id = item.id;
    $http.get(id + '.json').success(function (data) {
        //do something with data.
        console.log(item.name);
    })
})

我在评论中指出的问题是在循环中错误地使用闭包变量。

如果您想要support only IE9+,那么您甚至可以使用Array.forEach()

itemlist.forEach‎ (function (item, i) {
    var id = item.id;
    $http.get(id + '.json').success(function (data) {
        //do something with data.
        console.log(item.name);
    })
})

答案 1 :(得分:0)

要将值与回调函数相关联,您应该使用bind。 这样,您可以将任何对象附加到回调并通过this.object访问它:

function yourFunction() {
    for(var i=0; i < itemlist.length; i++){
    var item = itemlist[i];
    var id = item.id;
    var onSuccess = onSuccess.bind({item: item});
    $http.get(id + '.json').success(onSuccess);

}

 function onSuccess(data) {
    console.log(this.item.name);
}