AngularJS太晚解决$ http承诺

时间:2015-05-06 08:38:26

标签: javascript angularjs angularjs-service angular-promise

我写了一个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"}

1 个答案:

答案 0 :(得分:0)

您需要将逻辑放在.then()块内处理结果,“显示配置文件对象”日志记录位于应用程序的http请求 - 响应部分之外。 您可以将其视为一个独立运行的不同执行线程,并且不能保证“之前”的保证。