簡體   English   中英

如何在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的更改了嗎? 有什么不同於鏈接承諾的提示嗎?

使用$ 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]);
    });

這個(骯臟的)解決方案可以工作:

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上的finalArray 為了確保將query1的結果放置在query2之前,您可以嘗試傳遞什么並調用concat

這樣做的好處是,一個查詢的結果可能會滴入並導致UI更新,而另一個則不會。 如果這實際上對您的業務不利 ,那么我建議您使用另一個使用all功能的答案中的方法

您可以使用$q.all()等待兩個諾言,然后合並您的結果:

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

您可以根據需要使用此承諾。

如何嘗試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); }); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM