我有一个工厂,我使用$ http方法从服务器获取数据:
.factory('$factory', function ($q, $http, $timeout, $state, $ionicHistory, $localstorage) {
var obj = [];
var functions = {
getData: function () {
var dfd = $q.defer();
if(!obj){
$http({
url: remoteUrl+'/getdata',
method: 'POST',
data: {}
}).then(function(response) {
$timeout(function(){
obj = response.data;
dfd.resolve(response.data);
}, 2000)
}, function(response) {
}
}else{
return obj;
}
return dfd.promise;
}
}
}
因此,这将获取数据并将其放入对象中。如果我错了,请纠正我,但这种使用工厂进行此类操作的方法是这样的,它不依赖于控制器,可以在我的应用程序中的任何地方使用。
考虑到这一点,我希望这样做,这样我就可以在我的应用程序中的任何位置获取数据,而无需每次都查询服务器。即,一旦查询服务器,工厂就会将响应保存到对象中(就像我现在正在做的那样)。但是我之后在另一个控制器中访问数据时遇到了麻烦。
我已经开始通过使用if(!obj)行来制作我认为它应该是什么样子,但是在else语句中我似乎只能返回obj对象。它会抛出错误,因为它没有像预期的那样返回一个承诺。
我不确定我是否与此相符。
由于
答案 0 :(得分:2)
你正在返回一个承诺,所以你需要总是在缓存的响应中返回一个承诺,你可以通过将它包装在$ q.when(https://docs.angularjs.org/api/ng/service/ $ q)中来相对容易地做到这一点。这将立即得到答复。
return $q.when(obj);
虽然$ http服务内置缓存,但您可能需要查看缓存部分。
答案 1 :(得分:1)
这应该有效: Insteada将obj = []赋值为null。通常我更喜欢回调。您可以尝试以下代码:
.factory('$factory', function($q, $http, $timeout, $state, $ionicHistory, $localstorage) {
var obj = [];
var functions = {
getData: function(cb) {
// instead of checking !obj you have to check for length or you have to set obj as null
if (obj && obj.length == 0) {
$http({
url: remoteUrl + '/getdata',
method: 'POST',
data: {}
}).then(function(response) {
obj = response.data;
cb(response.data)
}, function(response) {
}
}
else {
cb(obj)
}
}
}
}
})
// You can use callback by following code
$factory.getData(function(response){
// response will come here
})