1

私はこのようなJavaScript呼び出しを持っています:

usernameTest('queijo');
alert('a');

この関数usernameTest()は機能しており、デバッグのために、文字列「t」または「f」に警告します。

このページをロードすると、最初に表示されるアラートが「a」で、「t」または「f」の後にのみ表示されるのはなぜですか?(ところで、jQueryもページに読み込まれます。)

[編集]

ソースコード:

function usernameTest(username) {
    var unReg = /^[0-9a-zA-Z_]{1,20}$/;
    if(!unReg.test(username))
        return false;
    $.ajax({
        type : 'POST',
        url : 'checkuser.php',
        data : 'username=' + username,
        cache : false,
        success : function(response) {
            if(response == 1) {
                alert('f');
                return false;
            } else {
                alert('t');
                return true;
            }
        }
    });
}

[編集2]

私はすでに問題がAJAXを呼び出すことであることを知っています。新しい主な質問はもう1つです。私はそれをそのように呼んでいます(デバッグ用のコードではなく、適切な場所で)。

if(!usernameTest(argument))
    //do something

どうすればこのようなことができますか?

4

5 に答える 5

2

@Bergiが言ったこと、またはusernameTest()AJAX関数のいずれか-つまり、非同期です。質問に機能のソースを含めることを検討してください。そうすれusernameTest()ば、答えが簡単になります。

更新:AJAX関数だと思います。コードをコールバックに入れる必要があります:

success : function(response) {
            if(response == 1) {
               //do stuff here - you can't return from here as this is asynchronous - i.e. happening independently (not at the same time) of the rest of the code
            } else {
                //do stuff here - you can't return from here as this is asynchronous - i.e. happening independently (not at the same time) of the rest of the code
            }
        }
于 2012-07-19T01:03:34.830 に答える
1

usernameTestajaxリクエストを行います。ajaxの最初のAは非同期を表します。リクエストが行われ、alert('a')呼び出しを含めてコードの実行がすぐに続行されます。応答がサーバーから返される場合にのみ、成功コールバックが実行されます。これにはが含まれalert('t')ます。

このスタイルの非同期実行は、Javascript開発の中心です。あなたはそれを受け入れ、あなたの問題を解決するためにそれを使わなければなりません。それと戦うことは悲しみにつながるだけです。

ちなみに、あなたが持っているreturnステートメントはから値を返さないことに注意してくださいusernameTest。それらは成功コールバックから戻ります。関数は何も返しませusernameTestん。このような非同期リクエストを同期関数のリターンに変える方法はありません。

サーバーからの回答を非同期的に使用する方法を見つける必要があります。たとえば、if呼び出しの句に入れるものは何でも、代わりにそのコードを成功コールバック自体に入れます。次に、trueまたはfalseの値にアクセスできるようになります。

于 2012-07-19T01:17:25.723 に答える
1

関数をパラメーターとしてusernameTestに渡して、使用するコードがシステムの状態に基づいて変更される可能性がある場合に、必要な処理を実行できます。それ以外の場合は、ifステートメントに直接コードを記述できます。

function usernameTest(username, onFailure) {
    // code here...

    $.ajax({
        // ajax setup here...
        success : function(response) {
            if(response == 1) {
                //...
            } else if (typeof(onFailure) === 'function' ) {
                onFailure();
            }
        }
    });
}

var name = 'Bob';
var onFailure = function() {
    // do something
};

usernameTest(name, onFailure);

また、質問をするときは具体的にしてください。不明な場合や詳しく説明する必要がある場合を除いて、質問を変更しないでください。誰かが元の質問に答えた場合、その人はクレジットを取得する必要があり、他の質問は個別に尋ねる必要があります。

于 2012-07-19T01:41:26.630 に答える
0

あなたのusernameTest関数は何も警告しませ、さもなければそれは警告「a」の前に来るでしょう。

何かのイベントリスナーがインストールされると確信しています(おそらくドキュメント対応ですか?-コードを教えていただければもっと教えていただけます)。ここで「ユーザー」に警告が表示されます。イベントリスナー関数はすぐには実行されませんが、将来的に実行されます。

于 2012-07-19T00:59:03.367 に答える
0

決して、アラートを使用しないでください。(){console.log()}または(){console && console.log()}を使用します。

アラートを使用すると、メッセージは1つだけ表示されます。あなたが決して持ちたくなかったメッセージ。

console.logを使用すると、Webを壊すことなく、関数のメッセージがインスタンスに表示されます。

何?[わかった]

于 2012-07-19T01:40:39.423 に答える