2010-12-02 16 views
0

私はこれをたくさんの場所で見ましたが、これはたくさん行われているのでおそらく馬鹿です。値を返す前にReadyStateが4になるのを待機しています

電子メールがまだ登録に使用されていない場合は、自分のウェブサイトの電子メールフィールドの横にチェックボックスを表示しようとしています。

$('[name=reg_email]').change(function() { 
    if(!emailUsed()) { 
     //Update image to be a green checkmark 
    } else { 
     //Update image to be a huge red X 
    } 
} 

そして、私の「emailUsed」機能は、電子メールアドレスがデータベースであるか否かに応じて、Javascriptのブール変数を返すべきである:私が持っているもの

はこのようなものです。これを容易にするために、スクリプトが存在するかどうかを判断するスクリプトを作成しました。そのため、emailUsed()関数はスクリプトを呼び出して戻るだけで済みますが、復帰する前にreadystate == 4になるまで待つ必要があり、readystateが4になるのを待って見つかったメソッドはすべて、まったく:

function emailUsed() { 
    var req = $.get('scripts/email_used.php?email='+$('[name=reg_email]').val()); 

    //Wait for req.readystate to be 4 

    return req.responseText == 'True'; 
} 

しかし、これを行う方法を説明しても値を返すものはどこにもありません。すべてのコールバック関数とこれと、それを使用するようだが、私は値を返すこのメソッドを取得できません。

助けてください!

答えて

2

req.readyState === 4のビジー状態を待つことは、設計上の習慣の悪さと考えられます。あなたはUIスレッドを縛り、ブラウザが更新されないようにします。サーバーの応答が遅い場合は、処理をキャンセルするかどうかを確認するメッセージが表示されます。

$ .get()を見ると、その引数の1つとして完了関数が使用されます。この関数で成功/失敗のロジックを実行する必要があります。これは、成功メッセージが返されるまで[送信]ボタンを無効にすることで実行できます。

+0

グレートをお勧めします!ありがとう。それはもともと私にちょっと混乱させましたが、私はそれを理解しました。 – TigerTrussell

0

あなたは非同期メソッドのポイントがありません。要点は、実行する計算があり、その計算を待っている現在のスレッドを縛りたくないということです。したがって、長時間実行されるメソッドは値を返すべきではなく、アプリケーション全体を待たずにコールのステータスを渡すコールバックを提供する必要があります。

私は、次の

function emailUsed (callback) { 
    var req = $.get('scripts/email_used.php?email='+$('[name=reg_email]').val(), 
     function(data) { 
      callback(data == 'True'); 
     } 
); 
} 

$('[name=reg_email]').change(function() { 
    emailUsed(function(isUsed){ 
     if (isUsed) { 
      //Update image to be a green checkmark 
     } else { 
      //Update image to be a huge red X 
     } 
    }); 
} 
関連する問題