让我的呼叫同步

时间:2016-07-05 21:14:40

标签: angularjs loops asynchronous

这里的问题是循环内的调用并不总是在下一个调用开始之前完成。例如,有时循环首先完成。基本上我需要这个是异步的。在第一个循环结束之前,第二个循环不应该开始。

我的控制器中的循环是这样的:

for(var i = 0; i < $scope.myArr.length; i++) {
     $scope.input1 = $(".input" + i).val();
     $scope.input2 = $(".input" + i).val();

     myService.addValues($scope.input1, $scope.input2);
}

将值发送到服务:

var addValues = function (name, sets, reps) {
    return $http({
        method: 'POST',
        url: "URL",
        headers: {
            'Content-Type': 'application/json'
        },
        data: {
            value1: value1,
            value2: value2
        }
    }).success(function () {
        console.log("Values added");
    });
};

请注意,我需要循环函数在控制器中,以便它可以从视图中获取值,而http请求在我的服务中,位于另一个JS文件中。

赞赏例子!

1 个答案:

答案 0 :(得分:1)

使用$q.all方法以可预测的方式解析一系列promise。

http://www.martin-brennan.com/using-q-all-to-resolve-multiple-promises/

var promises = [promiseAlpha(), promiseBeta(), promiseGamma()];

$q.all(promises).then((values) => {
    console.log(values[0]); // value alpha
    console.log(values[1]); // value beta
    console.log(values[2]); // value gamma
});

在您的应用程序中,您可能会执行以下操作:

var allPromises = [];

for(var i = 0; i < $scope.myArr.length; i++) {
     $scope.input1 = $(".inputA"+ i).val();
     $scope.input2 = $(".inputB" + i).val();

     allPromises.push(myService.addValues($scope.input1, $scope.input2));
}

// remember to inject $q service into controller/factory
$q.all(allPromises).then(function(values){
    console.log(values); // array of values in order they were added
});