0

以下のajax関数を使用して、入力したログインがデータベースにすでに登録されているかどうかを確認しています...

function freelog(login) {
    var data = {login:login};
    $.post ('freelog.php', data, function(response){
            if(response == '1') {
                freelogin = true;
            } else if(response == '0') {
                freelogin = false;
            } else {
                freelogin =  response;
            }
    });
    return freelogin;
}

もちろん、次の行に問題があります。

return freelogin;

その理由は、$.post が応答するのに時間がかかるためです... この問題を解決する方法がわかりません...

4

2 に答える 2

4

お分かりのように、「freelog()」関数に値を返させることはできないため、代わりに 2 番目の引数を受け入れます。これは、応答が利用可能になったときに呼び出す関数である必要があります。

function freelog(login, callback) {
    var data = {login:login};
    $.post ('freelog.php', data, function(response){
            if(response == '1') {
                freelogin = true;
            } else if(response == '0') {
                freelogin = false;
            } else {
                freelogin =  response;
            }
            callback( freelogin );
    });
}

JavaScript ブラウザー環境の非同期性により、すべての API がその形式に向かう傾向があります。

edit — 関数を呼び出すと、次のようになります。

  freelog( username, function( isOk ) {
    if ( isOk ) {
      // put a big green check mark next to the username field
    }
    else {
      alert("That user name is taken");
    }
  }

または何でも。

于 2012-05-26T13:16:34.447 に答える
0

Ajax は、非同期性の利点が欠点でもあるという点で、非常に苦痛です (少なくとも、それが標準であると考えるまでは)。

変数を設定するだけでなく、コールバックで結果を返す必要があります。これは、発見したように、ajax がまだ傾向があるため、値がありません。コードを簡単に変更する方法の一例を次に示します。

function freelog(login) {
    var data = {login:login};
    $.post ('freelog.php', data, function(response){
            if(response == '1') {
                freelogin = true;
            } else if(response == '0') {
                freelogin = false;
            } else {
                freelogin =  response;
            }
            return freelogin;
    });
}

私がしたことは、リターンを post コールバック内に移動しただけなので、リクエストが完了するまで返されません。他の人がアドバイスしているように、より洗練されて次のようなものを用意することをお勧めします。

  1. リクエストに 1 ミリ秒以上かかると仮定すると、スピナーまたは「チェック」または何らかのフィードバック。

  2. 実際に何か意味のあるものをfreelogin返すこと。「利用できません」を出力する応答を待っている別の関数によって呼び出されていると仮定すると、問題はありませんが、出力するだけの場合、freeloginまたは応答にすぐに依存するコードがある場合は、さらに改良する必要がありますスクリプトを非同期にします。

最後のアドバイスとして、コールバック関数を強化する良い方法を次に示します。

$.post ('freelog.php', data, function(response){
            return (Number(response) <= 1) ? Boolean(Number(response)) : response;
    });
于 2012-05-26T13:54:52.900 に答える