【问题标题】:call function after for loop completefor循环完成后调用函数
【发布时间】:2017-07-27 17:05:54
【问题描述】:

我尝试在 for 循环完成后调用函数 $scope.getThisFunction($scope.Num),我尝试了下面的代码但没有工作。有什么建议吗?

for(var i = 0; i < $scope.selection.length; i++) {                
    $http({
        method: "POST",
        url: '/url/' + $scope.Num + '/' + $scope.selection[i]
    }).then(function mySucces(response) {
        if(i == $scope.selection.length - 1) {  
           $scope.getThisFunction($scope.Num); //not working
        }
    }, function myError(response) {
        alert("SORRY, SOME TECHNICAL ERROR OCCUR");
    });
}

【问题讨论】:

  • 在 for 循环中创建 HTTP 帖子不是一个好主意。您应该重写您的 API 以在一个唯一调用中接受多个 selections。
  • @Pratyush Pranjal 您希望$scope.getThisFunction($scope.Num) 在循环的最后一个元素或您的帖子的最后回复中被调用?如果您希望在最后一个帖子回复时调用它,请尝试使用 promises($q.all)

标签: javascript angularjs http angular-promise


【解决方案1】:

制作单独的函数并在该函数中使用http请求。因为当 for 循环围绕它循环时,它引用了相同的参考。即使它创建了新的闭包,它也具有相同的引用。所以只取了for循环的最后一个索引

for (var i = 0; i < $scope.selection.length; i++) {
    sendReq(i)
};

function sendReq(i) {
    $http({
        method: "POST",
        url: '/url/' + $scope.Num + '/' + $scope.selection[i]
    }).then(function mySucces(response) {
        if (i == $scope.selection.length - 1) {
            $scope.getThisFunction($scope.Num); //not working
        }
    }, function myError(response) {
        alert("SORRY, SOME TECHNICAL ERROR OCCUR");
    });
}

【讨论】:

  • 谁对此投了反对票,如果不理解问题,请留下。很棒的循环概念,完美运行..!!谢谢
【解决方案2】:

我不太确定你想要完成什么。在您的示例中,您必须使用

if (i === $scope.selection.length)

但这会触发多次,因为当每个承诺解决时,条件很可能总是为真。

您应该使用 $q.all 并向其传递一组承诺。 $q 是一个角度服务,你只需要注入它。

未经测试:

var promises = []

for (var i = 0; i < $scope.selection.length; i++) {
  promises.push($http({
    method: 'POST',
    url: '/url/' + $scope.Num + '/' + $scope.selection[i]
  });
}

$q.all(promises).then(function() {
  $scope.getThisFunction($scope.Num);
}, function() {
  alert('Error')
});

编辑:

我看到你接受了另一个答案。让我保留您的代码并用 let 替换 var 而不是使用函数闭包会更容易。当然,这只有在您在 ES6 环境中工作时才有效。

for(let i = 0; i < $scope.selection.length; i++)
  ...

【讨论】:

    猜你喜欢
    • 2018-01-20
    • 2015-09-12
    • 2012-07-01
    • 1970-01-01
    • 2015-06-23
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多