我有一个强制用户登录的功能,如果他们点击提交并且发现他们没有登录:
$('#buildFormQueue').submit(function(){
return $.dialogs.forceLogin();
});
如果用户登录成功,我需要forceLogin()
返回true。然而,问题是登录表单由ajax加载并且forceLogin()
函数在用户之前完成执行看到登录对话框。
forceLogin : function(){
if(!$.loggedIn){
$.ajax('/index.php?act=loginDialog', {success:function(data){
$("#dialog-message").html(data)
.attr('title', 'Please Log In')
.dialog({
modal: true,
buttons: {
'Cancel': function(){
$(this).dialog('close');
},
'Log In': function(){
$this = $(this);
$.post('/index.php?act=loginDialog&mode=post', {
'username' : $("#dialog-message :input[name='username']").val(),
'password' : $("#dialog-message :input[name='password']").val()
}, function(data){
if(data == "true"){
$this.dialog('close');
$.loggedIn = true;
}else{
$this.find('div').slideDown('slow');
}
});
},
},
width: 400,
position: ['center', 50],
});
$('#dialog-message :input').keypress(function (e) {
if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
$('.ui-dialog-buttonset :last').click();
return false;
} else {
return true;
}
});
}});
return false;
}else{
return true;
}
},
forceLogin()
内是否有'Log In': function()
的回复方式?
答案 0 :(得分:1)
没有办法做到这一点,因为forceLogin
函数将同步完成,而ajax请求将异步完成。
解决这个问题的标准方法是让forceLogin
不返回任何内容,而是接受一个回调函数,稍后将传递登录结果。例如
forceLogin : function(callback) {
...
$.post(..., function(data) {
if (data === 'true') {
callback(true);
} else {
callback(false);
}
});
...
});
然后调用代码只需要将处理逻辑移动到lambda中。
老路:if (forceLogin()) {
succeededAction();
} else {
failedAction();
}
新方式:
forceLogin(function(succeeded) {
if (succeeded) {
succeededAction();
} else {
failedAction();
}
});