2017-08-25 34 views
0

我必須進行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

正是你想要什麼?您需要在需要解決之前呼叫數據的地方再打一次電話? –

+0

我希望能夠調用myFunction並返回一個對象。該對象由來自3個不同調用的數據組成。其中兩個調用是獨立的,我可以使用$ q.all,但是對於第三個調用,我需要將其作爲參數,前兩個調用 – eagleEye

+0

之一返回的數據值,如果您依賴於異步執行,那麼您不能直接返回數據,你必須返回一個承諾。否則,您可以返回一個引用並在稍後填充,請參閱'$ resource' –

回答

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承諾將完整的對象來解決。

+0

Promise鏈接是一種可行的方式。對於稍微更易讀的代碼,您可以定義成功函數並在'.then(func)'回調中使用它們的名稱。 – ryanyuyu

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'}); 


    $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]; 
    }) 
} 
相關問題