Я пытаюсь разрешить пару вызовов 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 и Пометить указатель Райкока.
P.S. then()
задокументировано в $q страница.
$http.get('…').then()
(который, как мне кажется, является методом$promise
), но мне нужны методыsuccess
иerror
(которых я не вижу дляthen
. (Я действительно не хочу устанавливать произвольную задержку/тайм-аут — просто продолжайте, когда придет время). готово, гр). - person Jakob Jingleheimer   schedule 17.07.2013