2013-07-17 72 views
4

我試圖解決一對夫婦ajax調用,以便我的控制器需要的數據在它(及其提供的指令)之前可用。但是執行的順序工作,而不是返回我創建對象,結果注入到我的控制器是$ HTTP的響應對象:

{ 
    config: { … }, 
    data: { … }, 
    headers: { … }, 
    status: 200 
} 

我的代碼基本上是這樣的:

app.config([ 
    '$routeProvider', function($routeProvider) 
    { 
    $routeProvider 
     .when('/path', { 
     …, 
     "resolve": { 
      "data": [ 
      '$http', 
      function($http) 
      { 
       return $http 
       .get('/api/data') 
       .success(function(data,status) { return data.rows[0]; }) 
       .error(function(data,status) { return false; }); 
      } 
      ] 
     } 
     }); 
    } 
]); 

上午我傻了?不應該$ http的成功返回值實際上是由$ http返回的值嗎?

我也試過

… 
"resolve": { 
    "data": [ 
    '$http', 
    function($http) 
    { 
     var response; 
     $http 
     .get('/api/data') 
     .success(function(data,status) { response = data.rows[0]; }) 
     .error(function(data,status) { response = false; }); 
     return response; 
    } 
    ] 
} 

但隨後注入到我的控制器data對象是不確定的(我猜是因爲$ HTTP是異步的,resolve沒有被$ HTTP,所以之前的$ HTTP返回準備好了)。

P.S. $ http的同步性應該可以在其選項對象中定義!

解決方案

app.config([ 
    '$routeProvider', function($routeProvider) 
    { 
    $routeProvider 
     .when('/path', { 
     …, 
     "resolve": { 
      "data": [ 
      '$http', 
      function($http) 
      { 
       return $http 
       .get('/api/data') 
       .then(
        function success(response) { return response.data.rows[0]; }, 
        function error(reason)  { return false; } 
       ); 
      } 
      ] 
     } 
     }); 
    } 
]); 

感謝Ajay beniwal's pointerMark Rajcok's pointer

P.S. then()記錄在$q's page

+1

您需要返回的承諾。請參閱http://stackoverflow.com/questions/11972026/delaying-angularjs-route-change-until-model-loaded-to-prevent-flicker,社區維基答案。 –

+0

我以前使用'$ http.get(「...」)。然後,()'(我認爲這是一個'$ promise'方法),但我需要'success'和'error'方法(我沒有看到('我真的不想設置任意的延遲/超時 - 只要繼續完成,grr)。 – jacob

+0

如果答案在那裏,爲什麼不把它作爲一個實際的答案? – user1338062

回答

2

$ HTTP @Returns {HttpPromise}返回{@link納克$ Q承諾。}對象 與 標準then方法和兩個HTTP具體方法:successerror。該then 方法有兩個參數成功以及錯誤回調將與一個 響應對象被調用。的successerror方法採取一個參數 - 的功能,當請求成功或失敗分別 將被調用。傳遞到 這些函數的參數被解構傳遞到 then方法響應對象的表示。響應對象具有以下屬性:

+0

會很棒如果對如何使用'then'及其回調在文檔中給出的例子:/ – jacob

+0

喔,還有在'$q''s docs jacob

+0

一個例子,你可以在augular圖書館閱讀$ q這是通過的返回值解決或拒絕 –