我写了一个AngularJS工厂profileService
,它处理设置/获取用户个人资料信息。其getProfile
方法调用我的Web API,返回带有用户数据的JSON对象,并使用该数据解析$http.get
promise。这个特殊的承诺正在login
方法中使用,该方法是身份验证工厂的成员。 login
中的代码块正在返回其自己的$http.post
承诺(它正在请求令牌)。我们的想法是在登录时检索并本地缓存用户的个人资料数据。
问题是$http.get
承诺解决得太晚了。也就是说,在我的控制台输出中,调用显示为解析为空(undefined
),紧接着是getProfile
的内联输出,显示成功的配置文件对象检索。调用存储已解析的promise的变量也会产生undefined
。
根据我的研究,我倾向于我没有正确思考承诺的问题。非常感谢任何帮助我理解错误的地方!
代码:profileService.getProfile(userName):
profileService.getProfile = function(userName) {
return $http.get(ntSettings.apiServiceBaseUri + '/api/Profile/GetProfile?userName=' + userName)
.then(function(response) {
return response.data;
});
};
代码:authService.login()调用getProfile
var profileService = $injector.get('profileService');
var userProfile = {};
profileService.getProfile(loginData.userName)
.then(function(response) {
userProfile = response;
console.debug("authSvc -> login -> getProfile: Got profile data:", response.userProfile);
}, function(error) {
console.error("authSvc -> login: Unable to fetch profile", error);
});
console.debug("authSvc -> login: Displaying profile object", response.userProfile);
控制台调试输出显示问题
authSvc -> login: Showing profile object: undefined
authSvc -> login -> getProfile: Got profile data: Object {FirstName: "John", LastName: "Doe", Birthday: "2015-05-06T04:00:00", Gender: 0, Location: "New York, NY"}
答案 0 :(得分:0)
您需要将逻辑放在.then()块内处理结果,“显示配置文件对象”日志记录位于应用程序的http请求 - 响应部分之外。 您可以将其视为一个独立运行的不同执行线程,并且不能保证“之前”的保证。