[英]How can I simulate a $http success in angular?
我在我的应用程序中的多个控制器中使用了一项服务。
该服务包含对PHP脚本的$ http调用,该脚本返回一些重要数据。
我想做的是,如果请求失败,则从用户的localstorage
存储中获取该数据,然后在所有控制器中调用绑定到$ http成功的所有函数。
这是我服务的一部分:
app.service('initialJSON', ['$http', function ($http) {
var vm = this;
vm.json = $http.get(url);
vm.json.success(function (data) {
if (typeof Storage !== "undefined") {
localStorage.initialJSON = data;
}
})
vm.json.error(function (data, status) {
if (typeof Storage !== "undefined" && "initialJSON" in localStorage) {
// call all success functions in all controllers with the locally saved data
}
});
}]);
作为示例,应调用此控制器中的函数:
app.controller('someCtrl', ['initialJSON', function(initialJSON) {
var vm = this;
initialJSON.json.success(function (data) {
// This function should be called and do some things with the data
});
}]);
我不知道这是否可行,或者我必须改变多少结构才能实现,但如果有人有想法,我将非常感激。
与其让控制器重用相同的$ http承诺,不如创建自己的控制器,并在获得结果后将其解析。
app.service('initialJSON', ['$http', '$q', function ($http, $q) {
var vm = this;
var deferred = $q.defer();
vm.json = deferred.promise;
var request = $http.get(url);
request.then(function (response) {
if (typeof Storage !== "undefined") {
localStorage.initialJSON = response.data;
deferred.resolve(response.data);
}
})
request.catch(function () {
if (typeof Storage !== "undefined" && "initialJSON" in localStorage) {
deferred.resolve(localStorage.initialJSON);
}
});
}]);
如果您的控制器只关心成功,那么上面的方法应该起作用。 如果您还需要它们也能够处理错误,则需要在尝试两次获取数据之后以某种方式扩展它以调用deferred.reject()
。
您可以只使用本地存储和cookie: https : //github.com/grevory/angular-local-storage
或者,如果您正在寻找一些更架构化的内容: https : //github.com/angular-pouchdb/angular-pouchdb
当您说“调用所有成功功能”时,您实际上应该将这些调用包装在一个Promise中。 因此服务可能类似于:
service('myService', ['$q',function($q){
var _privateServiceCall = function(){
return myPromiseBasedCall().then(
function(response){return response;}
).catch(function(err){
throw(err);
});
};
return {
publicServiceCall = function(){
var defer = $q.defer();
_privateServiceCall().then(function(response){
defer.resolve(response);
}).catch(function(err){
throw err;
})
return defer.promise;
}
}
}]);
当控制器需要服务中的数据时,它将请求该数据,而当准备就绪时,这些承诺将得到解决。
.controller('myController', ['$scope', 'myService', function($scope, myService){
myService.publicServiceCall().then(function(response){
console.log(response);
});
}
}]);
如果您想在按设置的时间表更新数据时设置广播,则可以在服务中使用rootscope广播,并在控制器中使用范围侦听器(scope继承了rootscope,但不会像rootscope侦听器那样导致内存泄漏) 。 但是,您应该尽可能使用Promise模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.