2017-05-03 10 views
0

私はAngularJSのオブジェクトを含む配列を持っています。これらのオブジェクトのプロパティ(snooz)の値に基づいて、私はPOSTリクエスト(getData.sonnzeUpdate())を呼び出さなければなりません。配列内の各オブジェクトを調べた後、最後にGET要求を呼び出す必要があります。私の問題は、POST要求の応答(res in .then(function(res){})を得る前に、GET要求(関数$scope.getTableData内)が実行されることです。AJAXの呼び出しforEachループAngular

angular.forEach()と$qを試しました。それらが終了した後、あなたは、その配列に約束を追加するので、$q.all(notifiedAlarms)

は、ここに私のコード・サンプルのコードで

var notifiedAlarms = []; 
var d = new Date(); 
var checkTine = d.getHours() + "-" + d.getMinutes() + "-" + "00"; 

angular.forEach(snoozedData, function (snoozed_asset, asset_key) { 
    if (snoozed_asset.snooz == checkTine) { 
     var data = {}; 
     snoozed_asset.snooz = ''; 
     data.data = snoozed_asset; 

     var deferred = $q.defer(); 
     getData.sonnzeUpdate(data).then(function (res) { 
      if (res.status == '200') { 
       toastr.info('Alarm with property ' + data.data.actualFailureArea + ' is activated'); 
       // $scope.getTableData(); //donot want to call it here. as same call will for multiple time 
       notifiedAlarms.push(deferred.promise); 
      } else { 
       // console.log('Error in update'); 
      } 
     }); 
    } else { 
     // no matching snooz 
    } 
}); 
$q.all(notifiedAlarms).then($scope.getTableData()); 
+0

ジェネレータはこの種のものにも適していることに注意してください。すべての約束のものをきれいにする。しかし、ダウンレベルジェネレータはまだTSでは問題があります。 –

+0

ここに更新コード – SSS

答えて

0

notifiedAlarmsは、その時点で空です。

遅延型反パターンを避けてください。 getData.sonnzeUpdate()は既にあなたにプロミスを返します。

angular.forEach(snoozedData, function (snoozed_asset, asset_key) { 
    if (snoozed_asset.snooz != checkTine) return; 
    snoozed_asset.snooz = ''; 

    notifiedAlarms.push(
     getData.sonnzeUpdate({ data: snoozed_asset }).then(function(res) { 
      if (res.status == '200') { 
       toastr.info('Alarm with property ' + data.data.actualFailureArea + ' is activated'); 
      } else { 
       throw new Error('Error in update'); 
      } 
     }) 
    ); 
}); 
+0

があります。 _ $ scope.getTableData_サービスをどこから呼び出すのですか?私の心配はこのサービスを呼び出すことです。 – SSS

0

あなたが$scope.getTableData()を実行する代わりに、直接の約束が解決されれば、それを呼び出すためにそれを言っている$q.all(notifiedAlarms).then($scope.getTableData())付き。したがって、あなたが望むより早く実行されます。

希望の動作を得るには、$q.all(notifiedAlarms).then($scope.getTableData);に変更してください。 、

myownservice.UpdateSomeData().then($scope.setValue) 
myownservice.UpdateSomeData().then($scope.setValue2()) 

フィドルに、私は両方の方法を持っているか

jsfiddle example

通知と、HTMLでのみvalueが更新されないvalue2

はここでこれを起草例です

+0

申し訳ありません(同じ実行.....それは応答を取得する前にサービスに行く_getTableData()_次にtoastrが表示されます – SSS

+0

@SSSあなたはコードをplunkerまたはfiddleに置いて、ローカルのMock APIでコードを再現できますか? JSONファイルですか?実際の例を見て間違っているとは言いません。 – tanmay

+0

はい、リンクを共有します – SSS