Can';t在JavaScript中为对象的变量赋值

Can';t在JavaScript中为对象的变量赋值,javascript,jquery,angularjs,arrays,object,Javascript,Jquery,Angularjs,Arrays,Object,我试图在angular js中读取一个文件,如果数据读取成功,它将把内容分配给对象的一个变量,否则它将把“NA”分配给同一个变量 function customer($scope, $http) { var i; $scope.courses = [{ name: "CSE", capacity: "CSE.txt" }, { name: "IT", capacity: "IT.txt" }, {

我试图在angular js中读取一个文件,如果数据读取成功,它将把内容分配给对象的一个变量,否则它将把“NA”分配给同一个变量

function customer($scope, $http) {
    var i;
    $scope.courses = [{
        name: "CSE",
        capacity: "CSE.txt"
    }, {
        name: "IT",
        capacity: "IT.txt"
    }, {
        name: "ECE",
        capacity: "ECE.txt"
    }];

    for (i = 0; i < 3; i++)
        $http.get($scope.courses[i].capacity).then(function (success) {
            $scope.courses[i].capacity = success.data;
        }, function (error) {
            $scope.courses[i].capacity = "NA";
        });

}

var myApp = angular.module("myApp", []);
myApp.controller("customerobj", customer);
功能客户($scope,$http){
var i;
$scope.courses=[{
名称:“CSE”,
容量:“CSE.txt”
}, {
名称:“IT”,
容量:“IT.txt”
}, {
名称:“欧洲经委会”,
容量:“ECE.txt”
}];
对于(i=0;i<3;i++)
$http.get($scope.courses[i].capacity)。然后(函数(success){
$scope.courses[i].capacity=success.data;
},函数(错误){
$scope.courses[i].capacity=“NA”;
});
}
var myApp=angular.module(“myApp”,[]);
myApp.controller(“customerobj”,客户);
我尝试以正常的表格格式访问以下部分

<td>ng-repeat="course in courses">{{course.capacity}}</td>
ng repeat=“课程中的课程”>{{course.capacity}

但每次我这样做时,它都会抛出一个错误:“无法设置未定义的属性'capacity',并显示文件名。即使找不到文件,也应该将值更新为“NA”。但事实并非如此。请帮我解决这个问题

将您的http服务调用封装在另一个函数中,如下面所示,并在循环中调用该函数,以便循环索引
i
值将在函数范围内保持不变

更新: 如果不需要单独的函数,也可以使用匿名函数

解决方案1 (i=0;i<3;i++)的
{
(功能(索引){
$http.get($scope.courses[index].capacity)。然后(函数(success){
$scope.courses[index].capacity=success.data;
},函数(错误){
$scope.courses[index].capacity=“NA”;
});
}(一)
}
解决方案2 (i=0;i<3;i++)的
{
服务呼叫(一)
}
函数serviceCall(索引){
$http.get($scope.courses[index].capacity)。然后(函数(success){
$scope.courses[index].capacity=success.data;
},函数(错误){
$scope.courses[index].capacity=“NA”;
});
}

将http服务调用包装到另一个函数中,如下面所示,并在循环中调用该函数,以便循环索引
i
值将保留在函数范围中

更新: 如果不需要单独的函数,也可以使用匿名函数

解决方案1 (i=0;i<3;i++)的
{
(功能(索引){
$http.get($scope.courses[index].capacity)。然后(函数(success){
$scope.courses[index].capacity=success.data;
},函数(错误){
$scope.courses[index].capacity=“NA”;
});
}(一)
}
解决方案2 (i=0;i<3;i++)的
{
服务呼叫(一)
}
函数serviceCall(索引){
$http.get($scope.courses[index].capacity)。然后(函数(success){
$scope.courses[index].capacity=success.data;
},函数(错误){
$scope.courses[index].capacity=“NA”;
});
}

代码正确。但for循环不是。当您将console.log(i)添加到错误函数时,您会看到3。但是你的数组有3个成员。http请求是异步的。for循环不能等待其响应。使用Gangadhar Jannu溶液。

代码正确。但for循环不是。当您将console.log(i)添加到错误函数时,您会看到3。但是你的数组有3个成员。http请求是异步的。for循环不能等待其响应。使用Gangadhar-Jannu溶液。

使用
进入
循环

for (let i = 0; i < 3; i++) { 
...... 
}
for(设i=0;i<3;i++){
...... 
}
参考:


使用
进入
循环

for (let i = 0; i < 3; i++) { 
...... 
}
for(设i=0;i<3;i++){
...... 
}
参考:


我认为使用let-in-for-loop是处理此类情况的更好方法。 Let in循环可以将其重新绑定到循环的每个迭代,确保重新分配上一个循环迭代结束时的值,因此可以使用它来避免闭包问题

for (let i = 0; i<3;i++) {

}

for(let i=0;i我认为使用let in for循环是处理此类情况的更好方法。
Let in循环可以将其重新绑定到循环的每个迭代,确保重新分配上一个循环迭代结束时的值,因此可以使用它来避免闭包问题

for (let i = 0; i<3;i++) {

}

for(让i=0;i尝试包装$http.get in函数。中的闭包似乎有问题javascript@DarshakGajjar因为错误是“无法设置未定义的属性'capacity',这表示
$scope.courses[i]
未定义的
。因为这是循环的一部分,所以在我看来,它与我链接的$scope.courses[I]是重复的。courses[I]已经在数组定义中定义了吗?@SiddharthaChoudhury您可以检查浏览器控制台吗?错误在哪一行抛出?$scope.courses[I]。capacity=“NA”;-此行尝试包装您的$http.get in函数。中的闭包似乎有问题javascript@DarshakGajjar因为错误是“无法设置未定义的属性'capacity',这表示
$scope.courses[i]
未定义的
。因为这是循环的一部分,所以在我看来,它与我链接的$scope.courses[I]是重复的。courses[I]已经在数组定义中定义了吗?@SiddharthaChoudhury您可以检查浏览器控制台吗?错误在哪一行抛出?$scope.courses[I]。capacity=“NA”-这行它正在工作。先生,如果你不介意的话,你能解释一下吗?@SiddharthaChoudhury它被称为闭包。如果你把函数放在循环之外,每个索引变量都绑定到函数上,否则它们将共享同一个变量。我建议你看看这就是重复的解决方案。你应该相反,我们会投票以欺骗的方式结束这一次…@Andreas虽然基本概念是相似的,OP甚至在我们都发表评论后也无法理解上下文。然后只有我给出了答案。这是有效的。先生,如果你不介意的话,你能解释一下吗?@SiddharthaChoudhury它被称为