我正在尝试解决几个 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 准备好之前返回)。
PS $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 的指针和Mark Rajcok 的指针。
PSthen()
记录在$q的页面上。