2012-02-18 75 views
0
返回從匿名函數的值

我有強制用戶登錄,如果他們點擊提交功能,並發現他們沒有登錄:內jQuery.ajax

$('#buildFormQueue').submit(function(){ 
    return $.dialogs.forceLogin(); 
}); 

我需要forceLogin()返回如果用戶登錄成功,則爲true ..但問題是,登錄表單由ajax加載,並且在用戶甚至看到登錄對話框之前完成執行功能。

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

沒有辦法做到這一點,因爲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(); 
    } 
}); 
+0

這實際上是更簡單,優雅的,比我的預期。問題是,只是將問題轉移到了不同​​的地方。傳遞給'$('#buildFormQueue')。submit()'的回調函數需要返回true以允許提交表單 - 但是如果我在'submit()'內部調用'forceLogin()',則傳遞的參數到那個回調函數需要找到它在'submit()'函數返回的級別。 – 2012-02-18 17:43:37

+0

@kavisiegel你可以攔截第一次提交,防止它,然後重新提交一旦登錄完成成功? – JaredPar 2012-02-18 17:48:27

+0

啊,現在這是我應該想到的!謝謝,我最終改成了'return $ .dialogs.forceLogin(function(){$ form.submit()});'並且在登錄成功時添加了一個callback()調用。萬分感謝! – 2012-02-18 18:07:42