从jQuery.ajax中的anon函数返回一个值

时间:2012-02-18 17:22:51

标签: javascript jquery anonymous-function

我有一个强制用户登录的功能,如果他们点击提交并且发现他们没有登录:

$('#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()的回复方式?

1 个答案:

答案 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();
  }
});