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

标签 javascript angularjs angular-services

在我的 Angular 应用程序中,我有一段这样的代码

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 循环,在循环内部有一个 Angular 服务来调用后端 api。 该数组只有一项。因此 i 的值应始终为 0。但是 console.log(i) 在服务调用之前打印 0 并且在服务调用之后打印 1。有人能指出这里发生了什么吗。

最佳答案

传递给 .then 方法的 callback 是一个闭包,当异步调用发生时,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)

关于javascript - AngularJS - 即使数组中只有一项,循环也会错误地递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43912243/

相关文章:

javascript - 使用 mocha 的 --debug-brk 开关启用 Node 调试器的正确方法是什么?

javascript - 缺少操作数;找到END

javascript - 如何将 Angular 生成的表从数据库导出为 csv 格式?

javascript - 将 UI 网格行数据绑定(bind)到 cellTemplate 中的 javascript 调用

angular - 服务和组件之间的循环依赖警告(Angular)

javascript - Canvas 动画 - 卡住

javascript - Angular 指令不在 ng-repeat 内部求值

javascript - $translateProvider.useStaticFilesLoader 的 Angular Translate 异步计时问题

angular - 在 Angular 2/4 中更改图像而不重新加载

JavaScript 选项卡式文件夹在 Internet Explorer 中不起作用