我目前正在开发基于 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
与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
问题是,无论我尝试什么,我都没有结果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中async的不同问题。我的问题在于我的代码不起作用,我无法理解为什么,尽管我过去已成功使用过promises。我不是问如何从异步调用中得到响应,但是在编写代码时有点帮助了解我出错的地方。如果你仍然认为这是重复的,请在评论中告诉我并且我会处理它,我可能错过了提供的链接中的内容。
答案 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);
});