您好,在以下Angular控制器中,我尝试使用Parse.com启动Facebook登录。 所以我创建了一个在fbLogIn上触发的promise。它应该做的是首先登录到facebook,并获取first_name并将其存储在fieldValuesService.ff中。 那么,它应该访问这个值并用它做一些事情。为了便于说明,我只使用了控制台日志。 发生的事情是第二个console.log在第二个之前在第一个之前被触发。然后是未定义的。 我不明白为什么在这种情况下,第一个.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;
};
});
答案 0 :(得分:3)
也许如果你重构你的代码,事情就会变得容易一些。
我建议将FB相关的所有内容重构为自己的服务,如:
module.factory('FBService', function ($q) {
var login,
logout,
getInformation;
login = function () {
var defered = $q.defer();
Parse.FacebookUtils.logIn(null, {
success: function (user) {
defered.resolve(user);
},
error: function (user, error) {
defered.reject(user, error);
}
});
return defered.promise;
};
logout = function () {
var defered = $q.defer();
Parse.User.logOut();
defered.resolve();
return defered.promise;
};
getInformation = function () {
var defered = $q.defer();
FB.api('/me', function (response) {
defered.resolve(response);
});
return defered.promise;
}
return {
login: login,
logout: logout,
getInformation: getInformation
};
});
module.controller("LoginCtrl", function ($scope, FBService, fieldValuesService) {
$scope.fbLogIn = function () {
FBService.login().then(function (user) {
$scope.currentUser = user;
return FBService.getInformation();
}).then(function (information) {
fieldValuesService.ff = information.first_name;
console.log(fieldValuesService.ff);
});
};
$scope.logOut = function () {
FBService.logout().then(function () {
$scope.currentUser = null;
});
};
});