不推迟延期的承诺 [英] Deferred promise not deferring
问题描述
喜在以下角控制器我尝试启动Facebook登录与Parse.com。
因此,我创建触发fbLogIn的承诺。什么是应该做的,是第一次登录到Facebook和抢FIRST_NAME并将其存储在fieldValuesService.ff。
然后,它应该访问此值,并用它做什么。为了说明目的,我只是用控制台日志。
什么情况是,在第二次则第二的console.log从第一。然后第一个因此是不确定之前触发。
我不明白为什么在第二。那么什么才能够在这种情况下第一个被触发。
另外第二个问题,注销之后,fbLogIn功能是未激活的某个时候。它不会再次触发登录过程
如果你对这个问题的线索你的帮助会大大AP preciated。
.controller('logController',
功能($范围,$ Q,fieldValuesService){
变种延迟= $ q.defer(); defer.promise
。然后(函数(){
Parse.FacebookUtils.logIn(NULL,{
成功:功能(用户){
如果(!user.existed()){
警报(用户注册并通过Facebook登录!);
}其他{
$ scope.currentUser =用户;
$ $范围适用于()。
FB.api('/我',函数(响应){
fieldValuesService.ff = response.first_name;
的console.log(fieldValuesService.ff); //日志鲍勃 });
}
},
错误:功能(用户,错误){
警报(用户取消了Facebook登录或没有充分授权。);
}
});
})
。然后(函数(){
的console.log(fieldValuesService.ff); //日志未定义
});
$ scope.fbLogIn =功能(){
defer.resolve(); }; //解析注销
$ scope.logOut =功能(形式){
Parse.User.logOut();
$ scope.currentUser = NULL; };
});
也许如果你调整你的code,事情会变得稍微容易一些。
我建议重构一切有关FB到它自己的服务,如:
module.factory('FBService',函数($ Q){
VAR登录,
登出,
获取信息;
登录名=函数(){
变种延迟执行= $ q.defer();
Parse.FacebookUtils.logIn(NULL,{
成功:功能(用户){
defered.resolve(用户);
},
错误:功能(用户,错误){
defered.reject(用户,错误);
}
});
返回defered.promise;
};
注销=功能(){
变种延迟执行= $ q.defer();
Parse.User.logOut();
defered.resolve();
返回defered.promise;
};
getInformation =功能(){
变种延迟执行= $ q.defer();
FB.api('/我',函数(响应){
defered.resolve(响应);
});
返回defered.promise;
}
返回{
登录:登录,
注销:注销,
getInformation:getInformation
};
});module.controller(LoginCtrl功能($范围,FBService,fieldValuesService){
$ scope.fbLogIn =功能(){
FBService.login()。然后(功能(用户){
$ scope.currentUser =用户;
返回FBService.getInformation();
}),然后(功能(信息){
fieldValuesService.ff = information.first_name;
的console.log(fieldValuesService.ff);
});
};
$ scope.logOut =功能(){
FBService.logout()。然后(函数(){
$ scope.currentUser = NULL;
});
};
});
Hi in the following Angular controller i try to initiate facebook login with Parse.com. So I created a promise triggered on fbLogIn. What it is supposed to do, is first login to facebook, and grab first_name and store it in fieldValuesService.ff. THEN, it is supposed to access this value and do something with it. For illustration purpose I just used console logs. What happens is that the second console.log in second then is triggered before the first one from first .then thus is undefined. I don't understand why anything in the second .then can be triggered before first one in this situation.
Also second problem, after a logout, the fbLogIn function is sometime inactive: it won't trigger the login process again.
If you have a clue on this issue your help will be greatly appreciated.
.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;
};
});
Maybe if you restructure your code, things will become a little bit easier.
I recommend to refactor everything FB related into its own service like:
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;
});
};
});
这篇关于不推迟延期的承诺的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!