来自Promise.all的值并不总是由Angular

时间:2017-10-06 07:58:37

标签: javascript angularjs angular-promise

我有一个像这样的控制器:

controller.things = ['a', 'b', 'c'];
controller.loading = true;
controller.responses = [];

controller.handlePromises = function(){
   var promises = [];

   for(promiseIndex = 0; promiseIndex < controller.things.length; promiseIndex++) {
        promises.push(controller.promise(things[promiseIndex]);
    }

    Promise.all(promises).then(function success(response){
        for(responseIndex = 0; responseIndex < response.length; responseIndex++){
           responses.push(response[responseIndex].data);
        }
        controller.loading = false;
    }
}

controller.promise = function(value){
   //Some $http request to Database;
}

controller.handlePromises();

controller.things中的内容数量取决于用户。附加到这是一个简单的html页面,它执行以下操作:

<div ng-if="!controller.loading">
    <div ng-repeat="response in controller.responses">
       {{response}}
    </div>
</div>

我的问题是内容有50/50的机会变得可见,有时我在调试器中看到承诺已经解决并且加载设置为false,但是ng-if不断隐藏内容。即使显示内容,ng-repeat表示controller.responses仍然是空的很有可能。

如果承诺已经解决,我怎样才能保证ng-if接受controller.loading为假,无论需要多长时间?另外,同样的问题是ng-repeat有时没有看到controller.responses中的值。我认为是超时,但这不是理想的解决方案,因为它可能需要在半秒到十秒。

1 个答案:

答案 0 :(得分:1)

问题是您使用的是Promise.all而不是$q$q是由Angular团队构建的Promise库,它将为您执行$digest周期。

$q.all(promises).then(function success(response) {
  for (responseIndex = 0; responseIndex < response.length; responseIndex++) {
    responses.push(response[responseIndex].data);
  }
  controller.loading = false;
});

Read more about $q