2017-05-17 108 views
1

我有一個合乎邏輯的問題。Angular JS鏈接承諾問題

我有物體在localStorage陣列。我想要做的是,他們每個人都有效地進行API調用,然後推送localStorage中的新項目,一旦完成,那麼只有route to a new component

if(migrationName){ 

     angular.forEach(JSON.parse($window.localStorage.selectedItems), function(item) { 
      var url = '/api/get_all_prices/'+item.details.id+'/us-1'; 
      HttpWrapper.send(url,{"operation":'GET'}).then(function(pricingOptions){ 
       item.selectedMapping = pricingOptions[0]; 
       vm.selectedItems[type].push(item); // Store it in a variable first  
       $window.localStorage.setItem('selectedItems',JSON.stringify(item)); 
      }); 

     }); 
     $rootRouter.navigate(["MigrationRecommendation"]); // Route once everything is done 
} 

我知道這是錯誤的。

我設置的循環localStorage的每一次也都曾經在陣列中完成,然後唯一途徑,我不處理。

如何更改邏輯?

回答

2

您應該使用$ q.all與Array.prototype.map創建承諾的數組:

var items = JSON.parse($window.localStorage.selectedItems) 

var promises = items.map(function(item) { 
    var url = '/api/get_all_prices/' + item.details.id + '/us-1'; 
    return HttpWrapper.send(url, {"operation": 'GET'}).then(function(pricingOptions) { 
    item.selectedMapping = pricingOptions[0]; 
    vm.selectedItems[type].push(item); // Store it in a variable first  
    $window.localStorage.setItem('selectedItems', JSON.stringify(item)); 
    }); 
}); 

$q.all(promises).then(function() { 
    $rootRouter.navigate(["MigrationRecommendation"]);  
}) 
+0

是啊,你是對的,速度更快。 :) –

+0

@dfsq感謝您的答案。但不是每次修改localStorage都不應該只添加所有項目,然後附加到localStorage。你只是爲了一個項目而做,而不是所有選定的項目。 – StrugglingCoder