我有一个工厂,我在其中使用 $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;
}
}
}
所以这会获取数据并将其放入一个对象中。如果我错了,请纠正我,但是这种使用工厂来执行此类操作的方法不会绑定(bind)到 Controller ,并且可以在我的应用程序中的任何地方使用。
考虑到这一点,我希望做到这一点,这样我就可以在我的应用程序中的任何地方获取数据,而不必每次都查询服务器。即一旦查询服务器,工厂就会将响应保存到一个对象(就像我现在所做的那样)。但是之后我在另一个 Controller 中访问数据时遇到了问题。
我已经开始使用 if(!obj) 行制作我认为它应该看起来的样子,但在 else 语句中我似乎不能只返回 obj 对象。它会抛出错误,因为它也没有像预期的那样返回 promise 。
我不确定我的想法是否正确。
谢谢
最佳答案
你要返回一个 promise ,所以你需要总是返回一个 promise ,即使是在缓存的响应上,你可以通过将它包装在 $q.when ( https://docs.angularjs.org/api/ng/service/ $q) 中来相对容易地在这个级别上做到这一点,这将返回立即解决的 promise 。
return $q.when(obj);
虽然 $http 服务内置了缓存,所以你可能想看看缓存部分。
关于angularjs - Angular JS 从工厂 AJAX 请求中保存信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36290848/