使用AngularJS承诺的麻烦

时间:2016-05-03 13:49:29

标签: javascript angularjs promise

我目前正在开发基于 node.js 的应用程序,服务器端似乎运行正常,但我在公共方面遇到了困难。

我尝试在控制器中使用 承诺 AngularJS 。这是我的代码:

var userId;
var userEmail = "somethingICanRecognizeInCaseItDoesntChange";

function getUserInfos(){
    var deferred = $q.defer();
    if(SessionStorageService.get('token')){
        Auth.isAlive().success(function(user){
            $scope.user = user;
            console.log("user :", user);
            console.log("user email :", user.email);
            deferred.resolve(user.email);
        });
    }
    else {
        $scope.user = {};
        deferred.resolve([]);
    }
    return deferred.promise;
}

userEmail = getUserInfos();
console.log("result :", userEmail);

我认为控制台中的resultuser email相同,但事实并非如此。 这是控制台日志:

result : Object { $$state: Object }
user : Object { firstName: "super", lastName: "admin", email: "a", isSuperAdmin: true, _ts: "2016-05-03T11:17:06.943Z" } website-ranking.js:41:21
user email : a

以下是我在浏览器控制台中点击Object所获得的屏幕截图:console

问题是,无论我尝试什么,我都没有结果a。我尝试了getUserInfos().$$stategetUserInfos().$$state.valuegetUserInfos().$$state.ObjectgetUserInfos().ObjectgetUserInfos().Object.value等内容,但这些都没有效果。

我在这里想念什么?我是以错误的方式使用承诺吗?我忘记了什么吗?

请不要犹豫,告诉我这个问题是否可以改进,我很乐意添加代码,或者您可能需要的任何信息来帮助我解决问题。

编辑:问题是,我已经在其他地方使用了大部分代码,只是因为我添加了承诺,我有点迷失了。例如,我使用Auth.isAlive()没有任何问题:

function getUserInfos(cb){
            if(SessionStorageService.get('token')){
                Auth.isAlive().success(function(user){
                    $scope.user = user;
                    cb();
                });
            }
            else {
                $scope.user = {};
                cb();
            }
        }

$ scope.user已在应用程序中进一步修改和使用,没有任何问题。

由于问题被标记为可能重复,我想更多地解释一下:我知道为什么我使用了一个承诺,我想我理解了javascript中async的不同问题。我的问题在于我的代码不起作用,我无法理解为什么,尽管我过去已成功使用过promises。我不是问如何从异步调用中得到响应,但是在编写代码时有点帮助了解我出错的地方。如果你仍然认为这是重复的,请在评论中告诉我并且我会处理它,我可能错过了提供的链接中的内容。

1 个答案:

答案 0 :(得分:4)

因为你的方法getUserInfos()返回一个promise,你可以这样做:

var userId;
var userEmail = "somethingICanRecognizeInCaseItDoesntChange";

function getUserInfos(){
    var deferred = $q.defer();
    if(SessionStorageService.get('token')){
        Auth.isAlive().success(function(user){
            $scope.user = user;
            console.log("user :", user);
            console.log("user email :", user.email);
            deferred.resolve(user.email);
        });
    }
    else {
        $scope.user = {};
        deferred.resolve([]);
    }
    return deferred.promise;
}

getUserInfos().then(function(_email){
  userEmail = _email;
  console.log("result :", userEmail);
});