2014-09-02 53 views
2

resolve方法中的一個變量具有另一個變量的依賴關係,可以在resolve方法中的變量之間共享相同的promise嗎?

似乎$ route.current.locals存儲解析的變量,但是當處理var2時,$ route.current.locals爲空,因爲var1尚未解析。什麼我想是這樣的:

$routeProvider.when('/report/:ruleId', { resolve: { 
    var1: ['$route', 'service', function ($route, service) { 
     return service.getRequest(); 
    }], 
    var2: ['$route', 'service', function ($route, service) { 
     return service.getAnotherRequest($route.current.locals.var1.id); 
    }] 
}}); 
+0

您需要使用$ q.all [請參閱文檔](https://docs.angularjs.org/api/ng/service/$q)並將結果放入一個對象{var1:value,var2: value} – 2014-09-02 14:55:56

+0

somePromise在var1的範圍內創建,var2使用somePromise的解析數據。我更新了代碼。 – 2014-09-02 15:02:40

+0

然後使用.then()。 (這也應該全部在服務中完成) – 2014-09-02 15:06:22

回答

4

我希望這將工作:

$routeProvider.when('/report/:ruleId', { resolve: { 
    vars: ['$route', 'service','$q' function ($route, service) { 
     var defer = $q.defer(), 
     data = []; 
     service.getRequest().then(function(firstResponse){ 
      data.push(firstResponse); 
      service.getAnotherRequest(firstResponse.id).then(function(secondResponse){ 
       data.push(secondResponse); 
       defer.resolve(data); 
      }); 
     }) 

     return defer.promise; 

    }], 

}}); 
1

我認爲在這種情況下,最好的選擇是不完全答應鏈接,更有希望的嵌套。這改變了輸出,但不顯著:

$routeProvider.when('/report/:ruleId', { resolve: { 
    bothVars: ['$route', '$service', function ($route, $service) { 
     return $service.getRequest(). 
     then(function(response1) { 
      return $service.getAnotherRequest(response1.data.id). 
      then(function(response2) { 
       return { 
        var1: response1.data, 
        var2: response2.data 
       }; 
      }); 
     }); 
    ] 
}}); 

這可能會變得有些瘋狂,如果你嵌套太深,但我認爲這是好的。我不喜歡這個解決方案,但這是我爲這個特殊問題找到的最好的解決方案。最後一點:不要以'$'開頭自己的服務。 Angular使用該約定來爲自己的服務避免衝突。

+0

發佈後發現,如果您擁有對服務端點(API)的控制權,那麼最好的整體解決方案可能是在可能的情況下從相同請求中返回所需的所有數據。 – threeve 2014-09-02 15:29:32

+0

這可能是解決方案,但如果我們能夠做到這一點將會很好。這種方式我覺得更加混亂。 – 2014-09-02 18:17:10