【发布时间】:2013-12-28 05:28:18
【问题描述】:
嗨,在下面的 Angular 控制器中,我尝试使用 Parse.com 启动 facebook 登录。 所以我创建了一个在 fbLogIn 上触发的承诺。它应该做的是首先登录 facebook,然后获取 first_name 并将其存储在 fieldValuesService.ff 中。 然后,它应该访问这个值并用它做一些事情。出于说明目的,我只使用了控制台日志。 发生的情况是第二个 console.log 在第二个 then 之前被触发,在第一个 .then 之前被触发,因此是未定义的。 我不明白为什么在这种情况下,第二个 .then 中的任何内容都可以在第一个之前触发。
还有第二个问题,在注销后,fbLogIn 函数有时会处于非活动状态:它不会再次触发登录过程。
如果您对此问题有所了解,我们将不胜感激。
.controller('logController',
function ($scope, $q, fieldValuesService) {
var defer = $q.defer();
defer.promise
.then(function() {
Parse.FacebookUtils.logIn(null, {
success: function(user) {
if (!user.existed()) {
alert("User signed up and logged in through Facebook!");
} else {
$scope.currentUser = user;
$scope.$apply();
FB.api('/me', function(response) {
fieldValuesService.ff = response.first_name;
console.log(fieldValuesService.ff); //logs bob
});
}
},
error: function(user, error) {
alert("User cancelled the Facebook login or did not fully authorize.");
}
});
})
.then(function(){
console.log(fieldValuesService.ff); //logs undefined
});
$scope.fbLogIn = function() {
defer.resolve();
};
// Parse log out
$scope.logOut = function(form) {
Parse.User.logOut();
$scope.currentUser = null;
};
});
【问题讨论】:
-
我认为您的问题可能是您的第一个
then没有返回执行第二个then的承诺。 -
我打赌
FB.api是异步的,这意味着function(response)在第二个then处理程序之后被调用。 -
我在自己的 then 处理程序中添加了 FB.api: .then(function(){ FB.api('/me', function(response) { return response; }) ; 然后访问它在接下来的处理程序中,但仍然遇到同样的问题