如何查看 angularJS 中的承诺?

How to watch a promise in angularJS?

目标:$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 的第一个承诺完成的时间抛出错误。 可以在 getData2 中使用 $scope.$watch 以便我可以观察 $scope.arrayFromPromise1 的变化吗?任何与链接承诺不同的提示?

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

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

这个怎么样:

$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 更新。如果这实际上是您业务的 缺点,那么我建议使用 .

中的方法

使用 $q.all 方法等待一堆承诺完成然后根据信息采取行动是一项简单的任务。

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

试试怎么样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);
});

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

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

您可以根据需要将其用于任意数量的承诺。