我必须进行3次调用,完成后将返回单个对象。前两个调用是独立的,但是第三个调用需要从前两个调用之一返回一个数据值作为参数之一。下面的模式搞砸了,我试图避免在我调用myFunction的地方进行第三次调用,任何想法如何解决这个问题
function myFunction(){
var promise1 = $http({method: 'GET', url: 'a/pi-o-url', cache: 'true'});
var promise2 = $http({method: 'GET', url: '/api-v-url', cache: 'true'});
var myNewObj = {obj1:{}, obj2: {}, obj3: {}};
$q.all([promise1, promise2])
//i'd like to somehow make all the calls in one single function (within myFunction and juts return a single object)
}
我不想这样做:
myFunction()
.then(function(data){
myNewObj.obj1 = data[0];
myNewObj.obj2 = data[1];
myService(data[0].id).then(function(moreData){
myNewObj.obj3 = moreData;
return moreData;
})
有什么想法吗?
答案 0 :(得分:2)
您可以执行以下操作:
function myFunction() {
var promise1 = $http({ method: 'GET', url: 'a/pi-o-url', cache: 'true' });
var promise2 = $http({ method: 'GET', url: '/api-v-url', cache: 'true' });
return $q.all([promise1, promise2]).then(function (data) {
var myNewObj = {
obj1: data[0],
obj2: data[1]
};
return myService(data[0].id).then(function (moreData) {
myNewObj.obj3 = moreData;
return myNewObj;
});
}
}
这样,使用promise chaining,来自myFunction
的承诺将通过完整对象解决。
答案 1 :(得分:0)
你可以并行调用前2个承诺,然后链接第3个承诺
function myFunction(){
var promise1 = $http({method: 'GET', url: 'a/pi-o-url', cache: 'true'});
var promise2 = $http({method: 'GET', url: '/api-v-url', cache: 'true'});
$q.all([promise1, promise2])
.then(function([result1, result2]) {
// after the first 2 promises resolve, create the 3rd promise
var promise3 = $http({method: 'GET', url: '/api-v-url', cache: 'true'});
// this will return an array with 3 promise values
return $q.all[result1, result2, promise3];
})
}