在我的角度应用中,我有一段像这样的代码
for (var i = 0; i < $scope.itemList.length; i++) {
if ($scope.itemList[i].serialNumber == quickCode) {
console.log(i)
returnsService.getNoReceiptErrorMessages($scope.itemList[i].sku, quickCode).then(function (response) {
console.log(i)
}
}
}
它只是一个for loop
并且在循环中有一个角度服务来调用后端api。
该阵列只有一个项目。因此,i
的值预计始终为0
。但是,服务电话打印console.log(i)
之前的0
和服务电话后打印1
。有人可以指出这里发生了什么。
答案 0 :(得分:2)
传递给callback
方法的.then
是一个闭包,当异步调用发生时,for循环将继续运行,并且计数器将继续递增。
闭包执行上下文有一个指向外部作用域及其所有变量的指针,你在这里遇到的是当回调被触发时以及console.log
循环已经完成和i计数器(在执行上下文中可用)将等于1的数组大小。
要将实际计数器保留在回调中,您可以将服务调用包装在一个即时调用的函数(创建一个独立的作用域)中,并将实际计数器作为参数传递。
(function(count){
//here i will be detached scoped to this function
returnsService.getNoReceiptErrorMessages($scope.itemList[count].sku,
quickCode).then(function (response) {
console.log(count)
}
})(i)
答案 1 :(得分:1)
这是关闭的问题,这就是为什么let
(ReadMore)进入图片,替换var by let
,将解决您的问题。
或者如果您不使用ECMA6,请附上您的电话,例如:
(function(variable){
// variable scope remain intact here
})(variable)
以下是您特定的问题section in above link