2016-07-05 4 views
-1

ここでの問題は、ループ内の呼び出しが次の呼び出しが開始される前に必ず終了するとは限らないことです。たとえば、ループが最初に終了することがあります。基本的に私はこれを非同期にする必要があります。 2番目のループは、最初のループが終了するまで開始してはなりません。私の呼び出しを同期させる

私のコントローラのループは、このようなものです:

サービスに値を送信し ​​

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ファイルにある私のサービスにあります。

例が分かります!

+0

:アプリケーションで

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 }); 

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

は、次のような何かを行う可能性があります。順序付けされた結果が必要な場合は、同期要求を使用するか、結果を処理する前にすべての要求が完了するまで待ちます。 –

+0

ループのポイントは何ですか? '$ scope.myArr'の' i'や要素を全く参照していません... – SteamDev

+0

投稿を編集しました – qua1ity

答えて

1

$q.allメソッドを使用して、予測可能な方法で約束を解決します。非同期を意味し、あなたがAJAXリクエストをやっている

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 
}); 
+0

答えをいただきありがとうございます。しかし、私は私のケースにそれを適用する方法がわからない – qua1ity

+0

より完全な例を追加しました。 – SteamDev

+0

GETリクエストの場合はこれが動作するのがわかりますが、POSTなので、データは「allPromises」にプッシュされたときに(間違った順序で)ポストされています – qua1ity

関連する問題