如果最后一次呼叫需要其中一个承诺,如何使用$ q.all

时间:2017-08-25 18:41:21

标签: javascript angularjs angular-promise

我必须进行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;
            })

有什么想法吗?

2 个答案:

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