目标:$ 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的变化吗?任何与链接承诺不同的提示?
答案 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);
});
});
仍然很脏,但有效:
$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);
});