我的问题是基于这个话题 https://groups.google.com/forum/#!msg/angular/qagzXXhS_VI/p9ArYjfivW8J在 Angular 谷歌小组中。
我想提供一个服务,存储通过 $http 从后端检索的一些基本数据,然后我只需要获取这些数据一次。喜欢,
var load = function() {
return $http.get(...).then(function(data) {
return data.user;
});
};
module.factory("userProvider", function() {
var user;
var getUser = function() {
if(!user) {
load().then(function(data) {
user = data;
});
}
return user;
};
return {
getUser : getUser
}
});
module.controller("UserController", ["userProvider", function UserController("userProvider") {
var user = userProvider.getUser();
// do something with user
}]);
问题是 Promise 链以 userProvider 结束,但不在控制器中结束,因此我第一次使用此控制器时用户未定义,因为数据尚未返回。
如何使用这样的存储服务并正确返回数据?谢谢!
您可以创建自己的承诺。这是修改后的代码:
module.factory( "userProvider", function( $q ) {
// A place to hold the user so we only need fetch it once.
var user;
function getUser() {
// If we've already cached it, return that one.
// But return a promise version so it's consistent across invocations
if ( angular.isDefined( user ) ) return $q.when( user );
// Otherwise, let's get it the first time and save it for later.
return whateverFunctionGetsTheUserTheFirstTime()
.then( function( data ) {
user = data;
return user;
});
};
// The public API
return {
getUser: getUser()
};
});
Update:@yohairosen 下面的解决方案对于很多情况来说都是一个很好的解决方案,但并不适合所有情况。在某些情况下,我们只想缓存成功的结果,就像我在这里所做的那样。例如,如果此请求的失败表明用户需要首先登录,那么我们不希望下一次调用(大概是在登录之后)传递缓存的失败。如果该方法在所有情况下调用之间不一定一致,则此方法更好;在所有其他情况下,@yohairosen 的解决方案更简单,值得推荐。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)