我有一个看起来像这样的工厂:
app.factory('thingFactory', function($http) {
var factory = {};
var things = [];
factory.refreshThings = function() {
return $http.post('/GetThings');
}
factory.initializeThings = factory.refreshThings()
.then(function(response) {
things = response.data;
}, function(response){
// some error handling code here...
});
factory.getThings = function() {
return things;
}
return factory;
}
和控制器
app.controller('myController', function($scope, thingFactory) {
$scope.things = thingFactory.getThings();
}
由于promises的异步性质以及其他正在初始化的集合(除things
之外),我是否应该关注getThings()
返回一个空数组,从而在{{{}之前返回1}}通话已解决?
这是一个更好的选择吗?
$http.post()
是否有一个安全的替代方案,我可以让控制器不去考虑承诺并且安全地从工厂获得收集品?
答案 0 :(得分:1)
你的代码肯定会有问题。在控制器使用工厂之前,工厂不会被实例化,因此在控制器调用{}之前不会初始化things
,此时initializeThings
将在您调用{{1}之前被调用,这可能会返回一个空数组。此外,遵循“让我们希望它在那里”的方法永远不是一个好主意。
我看到你可以采取两种方法:getThings
接受一个回调作为参数,或者它返回一个promise,它看起来像这样:
回调 - 我更喜欢回应而不是承诺,但这是个人的事情。另外,我使用NodeJS启发的语法:
getThings
承诺 - 不是最好的语法,但你明白了
var things; // no need to initialize array
// callback -> function (error, things) {}
factory.getThings = function (callback) {
if (things) {
return callback(null, things);
}
factory.refreshThings()
.then( function (response) {
things = response.data;
return callback(null, things);
}, function (reason) {
return callback(reason);
});
}
作为旁注,如果您使用的是RESTful API,则应使用GET来获取信息而不是POST。