AngularJS $ q承诺fullfillment取决于回报?

时间:2018-02-08 18:23:42

标签: javascript angularjs promise

我正在使用angularjs 1.6.1和$ q。我正在从API和API加载一堆数据。当承诺得到履行时,我有点麻烦。我正在做这样的事情:

// controller
this.dataOnePromise = dataOneService.get().then(function (response){
    $scope.dataOne = response.data;
    return $scope.dataOne;
});

this.dataTwoPromise = dataTwoService.get().then(function (response){
    $scope.dataTwo = response.data;
    return $scope.dataTwo;
});

let promises = [this.dataOnePromise, this.dataTwoPromise];

$q.all(promises).then(function(response){
    // data is loaded!
    // I will access $scope.dataOne and $scope.dataTwo
});

所有服务方法都是这样的:

 // service. Just the method, not the complete file
 get: function() {
    var defered = $q.defer();

    $http.get('my api endpoint').then(function(response) {
        defered.resolve(response);
    }, function(err) {
        defered.reject(err)
    });

    return defered.promise;
}

如果我在调用dataOneService和dataTwoService时没有明确地将返回值放在then的处理程序中,那么我是否有竞争条件? (因为$ q.all(promises)可以由服务完成,但是在将数据分配给范围的then处理程序之前)

我不完全理解$ q.all(承诺)何时实现。这取决于回报?

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

来自doc https://docs.angularjs.org/api/ng/service/$q

  

所有(许诺);

     

将多个承诺合并到一个在何时解决的承诺中   所有的输入承诺都得到了解决。

     

返回将使用数组/散列解析的单个promise   值,每个值对应于相同索引/键的promise   在promises数组/哈希中。如果任何承诺通过a解决   拒绝,由此产生的承诺将被拒绝   拒绝价值。

所以对你的问题, 我有竞争条件吗? 不,两个调用都是异步的,$ q.all()会等到所有的promise都被解析。

我完全不了解$ q.all(承诺)何时完成。这取决于收益? 是的,再次,当所有承诺都得到解决时,$ q.all()就会得到满足。

========== extra =====

我个人建议使用哈希作为承诺,这样你就可以为你的承诺命名,供以后参考。

var promises = {};
promises.promiseA = ...;
promises.promiseB = ...;

$q.all(promises).then(function(result){
   console.log(result.promisesA);
   console.log(result.promisesB);

});
相关问题