Javascript AngularJS使用promise时遇到的问题

Javascript AngularJS使用promise时遇到的问题,javascript,angularjs,promise,Javascript,Angularjs,Promise,我目前正在开发一个基于node.js的应用程序,服务器端似乎运行正常,但我在公共端遇到了困难 我试图在控制器中使用承诺和AngularJS。这是我的密码: var userId; var userEmail = "somethingICanRecognizeInCaseItDoesntChange"; function getUserInfos(){ var deferred = $q.defer(); if(SessionStorageService.get('token')

我目前正在开发一个基于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);
我原以为控制台中的
结果
用户电子邮件
相同,但事实并非如此。 以下是控制台日志:

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
得到的屏幕截图:

问题是,无论我做什么尝试,我都不会有结果。我试过像
getUserInfos().$$state
getUserInfos().$$state.value
getUserInfos().$$state.Object
getUserInfos().Object
getUserInfos().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中异步的不同问题。这里我的问题是我的代码不起作用,我不明白为什么,尽管我在过去已经成功地使用了承诺。我不是在问如何从异步调用中获得响应,而是想了解一下我在编写代码时出错的地方。如果您仍然认为这是重复的,请在注释中告诉我,我会处理它,可能是我在提供的链接中遗漏了某些内容。

因为您的方法getUserInfos()返回了一个承诺,所以您可以执行以下操作:

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);
});

因为您的方法getUserInfos()返回一个承诺,所以您可以执行以下操作:

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);
});

我建议查看Auth.isAlive函数所需的回调。您正在查看的对象看起来不是正确的响应,可能意味着函数返回多个参数。请检查我编辑的最后一部分,并告诉我您是否仍然认为它是重复的@Stenn_R:如果Auth.isAlive函数导致我的问题,那就太奇怪了,因为我以前使用它时没有任何问题,请检查我的编辑。您请求用户使用$http或$resource?请提供Auth.isAlive方法的代码。@kazu:Hm,我想这个问题和这个问题不太一样,尽管它们非常相似。不过,基本问题是相同的——您正在调用一个异步函数,并期望它立即返回其结果。在这种情况下,它实际上将返回一个承诺。您应该以以下形式使用它:
getUserInfos().then(函数(email){…})
@gonzalopincheraancibia它使用$http。我建议查看Auth.isAlive函数所需的回调。您正在查看的对象看起来不是正确的响应,可能意味着函数返回多个参数。请检查我编辑的最后一部分,并告诉我您是否仍然认为它是重复的@Stenn_R:如果Auth.isAlive函数导致我的问题,那就太奇怪了,因为我以前使用它时没有任何问题,请检查我的编辑。您请求用户使用$http或$resource?请提供Auth.isAlive方法的代码。@kazu:Hm,我想这个问题和这个问题不太一样,尽管它们非常相似。不过,基本问题是相同的——您正在调用一个异步函数,并期望它立即返回其结果。在这种情况下,它实际上将返回一个承诺。您应该以以下形式使用它:
getUserInfos().then(函数(email){…})@gonzalopincheraancibia它使用$http。