2016-05-03 57 views
0

我目前正在处理一个基于node.js的应用程序,服务器端似乎运行正常,但我与公共方面有困难时期。使用承诺与AngularJS的问题

我想在控制器使用承诺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在控制台将是一样user 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().$$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中异步的不同问题。这里我的问题是,我的代码不起作用,我不明白为什么,虽然我已经成功地使用过去的承诺。我没有问如何从异步调用中获得响应,但有点帮助了解在写代码时出错的地方。如果您仍然认为这是重复的,请在评论中告诉我,我会处理它,可能是我错过了提供的链接中的某些内容。

+0

我会建议寻找到需要为您的Auth.isAlive函数的回调。你正在看的对象看起来不是一个正确的响应,可能意味着该函数返回多个参数 –

+0

Joe Clay请检查我编辑的最后部分,并告诉我你是否仍然认为它是重复的。 @Stephn_R:Auth.isAlive函数会导致我的问题,因为我之前没有任何问题使用它,这会很奇怪,请检查我的编辑。 – kazu

+0

您的请求获取用户使用$ http或$ resource?请提供Auth.isAlive方法的代码。 –

回答

4

因为你的方法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); 
});