[英]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);
});
});
仍然很臟,但是可以工作:
$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.