This question already has answers here:
Is this a “Deferred Antipattern”?
(3个答案)
2年前关闭。
在我的$ routeProvider中,我有一个resolve属性,可以在实例化控制器之前从API获取数据。为什么在将$ q与$ http服务一起使用时,可以将数据传递给控制器。他们不是都在做同一件事吗?
这是我无法将数据传递到控制器的原始方法:
AccountService.js
要将数据传递到控制器,我将GetAccounts更改为:
route.js
(3个答案)
2年前关闭。
在我的$ routeProvider中,我有一个resolve属性,可以在实例化控制器之前从API获取数据。为什么在将$ q与$ http服务一起使用时,可以将数据传递给控制器。他们不是都在做同一件事吗?
这是我无法将数据传递到控制器的原始方法:
AccountService.js
app.factory('AccountService', ['$http', '$q', function ($http, $q) {
return {
GetAccounts: function () {
return $http.get('api/Account/GetAccounts')
.then(function success(response) {
return response;
}, function error(response) {
̶r̶e̶t̶u̶r̶n̶ throw console.log("Oops!");
});
},
};
}]);
要将数据传递到控制器,我将GetAccounts更改为:
app.factory('AccountService', ['$http', '$q', function ($http, $q) {
return {
GetAccounts: function () {
var deferred = $q.defer();
$http.get('api/Account/GetAccounts')
.then(function (data) {
deferred.resolve(data.data);
})
.catch(function (response) {
deferred.reject(response);
})
return deferred.promise;
},
};
}]);
route.js
app.config(['$routeProvider', function ($routeProvider) {
$routeProvider.when('/users', {
template: '<admin accounts="$resolve.accounts"></admin>',
resolve: {
accounts: function (AccountService) {
return AccountService.GetAccounts()
.then(function (data) {
return data;
})
}
}
})
}]);
最佳答案
$ q是Angulars的承诺包装器。 $ http直接返回承诺,因此无论您是直接使用新的$ q还是$ http创建新的承诺,它们都是相同的