2012-02-18 7 views
0
内アノン関数から値を返す

私は、彼らが提出をクリックした場合にログインするユーザーを強制的機能を持っており、それは彼らがログインしていない検索します。jQuery.ajax

$('#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; 
    } 
}, 

'Log In': function()内から復帰するforceLogin()の方法はありますか?

答えて

1

forceLogin関数は、ajax要求が非同期的に完了している間に同期が完了するため、これを行う方法はありません。

これを回避するための標準的な方法は、forceLoginに何も返さず、代わりにログイン結果が後で渡されるコールバック関数を取り込むことです。例えば、

forceLogin : function(callback) { 
    ... 
    $.post(..., function(data) { 
    if (data === 'true') { 
     callback(true); 
    } else { 
     callback(false); 
    } 
    }); 
    ... 
}); 

呼び出しコードは、処理ロジックをラムダに移動するだけでよい。

古い方法:

if (forceLogin()) { 
    succeededAction(); 
} else { 
    failedAction(); 
} 

新しい方法:

forceLogin(function(succeeded) { 
    if (succeeded) { 
    succeededAction(); 
    } else { 
    failedAction(); 
    } 
}); 
+0

実際に私が予想していたよりもはるかに簡単かつエレガントです。しかし問題は、問題を別の場所に移しただけです。 '$( '#buildFormQueue')。submit()'に渡されたコールバック関数は、フォームを送信するためにはtrueを返す必要がありますが、 'submit()'の中で 'forceLoginそのコールバックには、 'submit()'関数で返すべきレベルを見つける必要があります。 –

+0

@kavisiegelあなたは最初にサブミットを傍受し、それを防ぎ、ログインが成功裏に完了したら再提出できますか? – JaredPar

+0

ああ、今それは私が考えたはずのものです!ありがとう、私は '$を返すように変更したばかりです。' $ .dialogs.forceLogin(function(){$ form.submit()}; ')、成功時のログイン時にcallback()コールを追加します。ありがとう、トン! –

関連する問題