我正在配置一个AngularJS应用程序,并且在控制器加载之前确保我的承诺被解雇时遇到一些麻烦。我的理解是,这可以做到。一点代码:
首先,这是路由器代码:
$routeProvider
.when('/apage', {
controller: 'APageController',
templateUrl: 'app/apage/apage.view.html',
requiresLogin: true,
resolve: {
"data": function($q, data1Service, data2Service) {
var data1 = data1Service.getData();
var data2 = data2Service.getData();
return $q.all({
data1: data1.$promise,
data2: data2.$promise});
}
}
})
...
这是一个服务功能(两者都相似)......
function getData() {
var deferred = $q.defer();
$http(req)
.success(function(data, status, headers, config) {
// store data ...
deferred.resolve(1); // just a flag to say it worked
$rootScope.$apply();
})
.error(function(data, status, headers, config) {
deferred.resolve(0);
$rootScope.$apply();
});
return deferred.promise;
}
这是控制器代码......
angular
.module('app')
.controller('APageController', APageController);
APageController.$inject = [... 'data'];
function APageController(... data) {
var data1 = data.data1;
var data2 = data.data2;
...
这三个文件都在不同的文件中,但是同一模块的一部分。必须有一些我忽略的概念。这里有什么明显可以解释为什么我的决心承诺没有解决?
谢谢。
答案 0 :(得分:1)
如果您将对象字面值传递给q.all
,它将立即解析。而是传递承诺数组,以便等待它解决拒绝。在您的情况下也不需要.$promise
,因为您已经从服务中返回了一个承诺(基于显示的代码)。 $promise
通常由$resource
即
return $q.all([data1Service.getData(),
data2Service.getData()]);
并期望data
成为从2次以上调用中解析的数据数组。
或创建2个结算:
resolve: {
"data": function($q, data1Service, data2Service) {
return data1Service.getData();
},
"data2": function($q, data1Service, data2Service) {
return data2Service.getData();
}
}
并注入data
和data2
。
否则,链接并更改响应格式以期望您最初尝试获取的方式。
resolve: {
"data": function($q, data1Service, data2Service) {
return $q.all([data1Service.getData(),data2Service.getData()])
.then(function(response){
return {
data1:response[0],
data2:response[1]
};
});
}
}
不要将rootScope.apply放在你的服务中,它会导致摘要已经在进行中错误(因为有角度)。 $http
会自动解决此问题。
你只需要这个。
function getData() {
return $http(req);
}