在Angular JS中链接承诺的问题

时间:2017-05-17 11:26:08

标签: javascript angularjs

我有一个合乎逻辑的问题。

我在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,而且一旦数组中的所有内容都完成,我就不会处理。

如何更改逻辑?

1 个答案:

答案 0 :(得分:2)

你应该使用$ q.all和使用Array.prototype.map创建的promises数组:

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