Javascript 在循环内使用回调进行闭包访问
Javascript closure access with callbacks inside loop
我应该怎么做才能使最后一行代码 return 成为一个值?
$scope.runActionwithObjects = function() {
for (var i = 0; i < $scope.Objects.length; i++) {
console.log($scope.Objects[i]); //$scope is accessible
$http.get($scope.Objects[i]["Commit"]).success(function (data) {
console.log($scope.Objects[i]);//return undefined
你的 $scope.Objects[i]
未定义的原因是因为变量 i
总是 = $scope.Objects.lenth + 1
,例如你有 5 个元素,i 将是 6,因为当时的回调,它已经得到了最后一个值。
一个解决方案是将需要的对象绑定到该方法,因此我们可以通过 this
访问它(我们不能通过闭包直接引用 ref
变量,因为它仍然存储最后一项), 例如:
for (var i = 0; i < $scope.Objects.length; i++) {
var ref = $scope.Objects[i];
// console.log($scope.Objects[i]); //$scope is accessible
var successCallback = (function (data) {
console.log(this);//return the ref
}).bind(ref);
$http.get('').success(successCallback);
}
}
问题是由于 异步 的 ajax 个请求。
当执行 success
回调时,您的循环 已经完成 并且 i
变量已经等于 $scope.Objects.length
。
尝试forEach。此函数将为数组中的项目创建不同的闭包。
$scope.Objects.forEach(function(currentObject){
console.log(currentObject); //$scope is accessible
$http.get(currentObject["Commit"]).success(function (data) {
console.log(currentObject);
});
});
我应该怎么做才能使最后一行代码 return 成为一个值?
$scope.runActionwithObjects = function() {
for (var i = 0; i < $scope.Objects.length; i++) {
console.log($scope.Objects[i]); //$scope is accessible
$http.get($scope.Objects[i]["Commit"]).success(function (data) {
console.log($scope.Objects[i]);//return undefined
你的 $scope.Objects[i]
未定义的原因是因为变量 i
总是 = $scope.Objects.lenth + 1
,例如你有 5 个元素,i 将是 6,因为当时的回调,它已经得到了最后一个值。
一个解决方案是将需要的对象绑定到该方法,因此我们可以通过 this
访问它(我们不能通过闭包直接引用 ref
变量,因为它仍然存储最后一项), 例如:
for (var i = 0; i < $scope.Objects.length; i++) {
var ref = $scope.Objects[i];
// console.log($scope.Objects[i]); //$scope is accessible
var successCallback = (function (data) {
console.log(this);//return the ref
}).bind(ref);
$http.get('').success(successCallback);
}
}
问题是由于 异步 的 ajax 个请求。
当执行 success
回调时,您的循环 已经完成 并且 i
变量已经等于 $scope.Objects.length
。
尝试forEach。此函数将为数组中的项目创建不同的闭包。
$scope.Objects.forEach(function(currentObject){
console.log(currentObject); //$scope is accessible
$http.get(currentObject["Commit"]).success(function (data) {
console.log(currentObject);
});
});