AngularJS - 即使数组中只有一个项目,也会错误地循环递增

时间:2017-05-11 09:59:57

标签: javascript angularjs angular-services

在我的角度应用中,我有一段像这样的代码

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。有人可以指出这里发生了什么。

2 个答案:

答案 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)

这是关闭的问题,这就是为什么letReadMore)进入图片,替换var by let,将解决您的问题。 或者如果您不使用ECMA6,请附上您的电话,例如:

(function(variable){
  // variable scope remain intact here 
})(variable)

以下是您特定的问题section in above link

See also this Fiddle