Angularjs在for循环中承诺

时间:2016-07-20 20:29:42

标签: angularjs for-loop angular-promise

我有以下代码循环遍历报告列表,更改每个人的姓名并进行更新。如果列表中只有一个报告,它可以正常工作,但如果有2个报告,那么只有第二个报告会更新。

当我查看网络选项卡时,我看到第一个报告中只有一个GET调用,但是对于第二个报告,有GET和PATCH调用。

我怀疑在这个异步循环中,当第二个报告的GET返回时,变量thisReport会被覆盖,然后继续更新第二个报告。第一份报告没有机会获得更新。

我的问题是我应该如何重写代码,以便列表中的所有报告都可以更新。抱歉新手问题。所有建议都表示赞赏!

for (var i = 0; i < $scope.listOfReports.length; i++) {
  var reportId = $scope.listOfReports[i].Id;
  if (reportId > 0) {
    var thisReport = reportSvc.query({ key: reportId });
    thisReport.$promise.then(function (data) {
        thisReport.name = newValue;
        thisReport.$update({ key: reportId }).then(function () {
        });
    });
}}

1 个答案:

答案 0 :(得分:1)

经过更多的研究,我知道这是一个封闭内部循环模式,我通过为最初在循环内部的逻辑创建一个函数来解决这个问题。下面的新代码

for (var i = 0; i < $scope.listOfReports.length; i++) {
 var reportId = $scope.listOfReports[i].Id;
 UpdateValue(reportId, ANewName);    
}

function UpdateValue(reportId, newName)
{
   if (reportId > 0) {
     var thisReport = reportSvc.query({ key: reportId });
     thisReport.$promise.then(function (data) {
        thisReport.name = newName;
        thisReport.$update({ key: reportId }).then(function () { });
     });
   }
}