如何在angularJS中观看承诺?

时间:2016-06-29 08:13:49

标签: javascript angularjs angular-promise

目标:$ scope.finalArray = $ scope.arrayFromPromise2.concat($ scope.arrayFromPromise1);

第一种方法

 $scope.arrayFromPromise1 = [];
 $scope.arrayFromPromise2 = [];

 someService.query1()
   .then(function(success){
      $scope.arrayFromPromise1 = success.data;
      return someService.query2();
   })
   .then(function(success){
      $scope.arrayFromPromise2 = success.data;
      $scope.finalArray =  $scope.arrayFromPromise2.concat($scope.arrayFromPromise1);
   });

第二种方法

$scope.arrayFromPromise1 = [];
$scope.arrayFromPromise2 = [];

function getData1(){
  someService.query1().then(function(success){
    $scope.arrayFromPromise1 = success.data
  });
}

function getData2(){
  someService.query2().then(function(success){
   $scope.arrayFromPromise2 = success.data;

   $scope.finalArray =  $scope.arrayFromPromise2.concat($scope.arrayFromPromise1);
  });
}

getData1();
getData2();

第二种方法将引发错误,具体取决于 getData1 完成的第一个承诺的时间。 可以使用$ scope。$ watch里面的getData2所以我可以看看$ scope.arrayFromPromise1的变化吗?任何与链接承诺不同的提示?

5 个答案:

答案 0 :(得分:4)

使用download it here方法等待一堆承诺然后对信息采取行动是一项简单的任务。

//We are returned a promise with a .then block to extract the data
//this is making a certain assumption that we are using the $http service
//where as using another such as $resource or restangular will "unwrap"
//the data for us...

var query1Promise = someService.query1().then(function(res) { return res.data; });
var query2Promise = someService.query2().then(function(res) { return res.data; });

$q.all([query1Promise, query2Promise])
    .then(function(promises) {
         $scope.finalArray = promises[0].concat(promises[1]);
    });

答案 1 :(得分:3)

这个(脏)解决方案可行:

someService.query1().then(function (success1) {
    someService.query2().then(function (success2) {
        $scope.finalArray = success1.data.concat(success2.data);
    });
});

使用$ watch

的第二个解决方案

仍然很脏,但有效:

$scope.array1 = [];
$scope.array2 = [];
$scope.finalArray = [];

someService.query1().then(function (success1) {
    $scope.array1 = success.data;
});

$scope.$watchCollection('array1', function (newData, oldData) {
    someService.query2().then(function (success) {
        $scope.finalArray = newData.concat(success.data);
    });
});

清洁剂解决方案

使用$q.all()等待多个承诺得到解决并使用数据然后执行某些操作:

$q.all([someService.query1(), someService.query2()]).then(function (results) {
    $scope.finalArray = results[0].data.concat(results[1].data);
});

答案 2 :(得分:1)

这个怎么样:

$scope.finalArray = [];

someService.query1()
   .then(function(response){
      $scope.finalArray = $scope.finalArray.concat(response.data);
   });

someService.query2()
   .then(function(response){
      $scope.finalArray = response.data.concat($scope.finalArray);
   });

两个调用将并行异步完成。每当一个人准备就绪,它将改变范围内的finalArray。为确保query1的结果位于query2之前,您可以使用传递的内容并调用concat

优点是来自一个查询的结果可以在另一个查询失效之前进入并导致UI更新。如果这对您的企业来说实际上是缺点,那么我建议您使用another answer that utilizes the all function中的方法。

答案 3 :(得分:0)

您可以使用$q.all()等待两个承诺,然后结束您的结果:

$q.all([someService.query1(), someService.query2()])
.then(function(dataSet) {
  $scope.finalArray = dataSet[0].data.concat(dataSet[1].data);
});

您可以根据需要使用此承诺。

答案 4 :(得分:-1)

如何尝试Promise.all

var promise = Promise.all([someService.query1(), someService.query2()]);

promise.then(function(result){
   $scope.arrayFromPromise1 = result[0];
   $scope.arrayFromPromise2 = result[1];
  
   $scope.finalArray = $scope.arrayFromPromise2.concat($scope.arrayFromPromise1);
});