我試圖解決一對夫婦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 pointer和Mark Rajcok's pointer。
P.S. then()
記錄在$q's page。
您需要返回的承諾。請參閱http://stackoverflow.com/questions/11972026/delaying-angularjs-route-change-until-model-loaded-to-prevent-flicker,社區維基答案。 –
我以前使用'$ http.get(「...」)。然後,()'(我認爲這是一個'$ promise'方法),但我需要'success'和'error'方法(我沒有看到('我真的不想設置任意的延遲/超時 - 只要繼續完成,grr)。 – jacob
如果答案在那裏,爲什麼不把它作爲一個實際的答案? – user1338062