1

重複の可能性:
JavaScriptコードを*順番に*実行するにはどうすればよいですか

var cek = false;

function checkForm()
{
    var user = document.forms["LoginForm"]["user"].value;
    var pwd = document.forms["LoginForm"]["pwd"].value;
    AJAXfunc("checkidpass.php?id="+user+"&pass="+pwd,function()
    {
        if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200))
        {
            $("#LoginRes").html(xmlhttp.responseText);
            if (xmlhttp.responseText == "")
                cek = true;
        }
    }); //---> 1

    return cek; //---> 2
}

「return cek;」の理由をお聞きしたいです。(パート 2) は AJAXfunc (パート 1) の前に実行されますか? そして、正しい順序で実行する方法を知りたいです。

ご協力いただきありがとうございます !

4

4 に答える 4

2

問題を理解するには、非同期メソッドを理解する必要があります。簡単なグーグルで、たくさんの読み物が得られます。ここから始めることをお勧めします:

Ajax をマスターする: 第 2 回: JavaScript と Ajax を使用して非同期リクエストを作成する

ヒント:現在行っていることは、同期関数にすることを選択しない限り (推奨されません)、決して機能しません

于 2013-01-17T15:40:03.280 に答える
0

応答を受け取ったときにコールバックをトリガーするようにコードを再構築するのが最善です。

すなわち。1. checkForm にコールバック引数を持たせる 2. そのコールバックを結果でアクティブにする 3. 関数のリターンをたどるのではなく、残りのコードをコールバックに入れる

例えば:

// before (wrong):
result = checkForm();
handleResult1(result);
handleResult2(result);

// after (correct):
checkForm(function(result) {
    handleResult1(result);
    handleResult2(result);
}
于 2013-01-17T15:44:34.227 に答える
0

これは、AJAX 呼び出しが非同期であるためです。

AJAXfunc呼び出しはステートメントの前に実行されますが、呼び出しreturnで指定した無名関数AJAXfuncは後で呼び出されます。

ステートメントの前にコールバックを実行する方法returnは、AJAX 呼び出しを同期化することです。ただし、応答を待っている間にブラウザがフリーズするため、これは一般的には良い考えではありません。

これを処理する通常の方法は、checkForm関数でコールバックを使用することです。

function checkForm(callback) {
  var user = document.forms["LoginForm"]["user"].value;
  var pwd = document.forms["LoginForm"]["pwd"].value;
  AJAXfunc("checkidpass.php?id="+user+"&pass="+pwd,function() {
    if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) {
      $("#LoginRes").html(xmlhttp.responseText);
      callback(xmlhttp.responseText == "");
    }
  });
}

使用法:

checkForm(function(cek) {
  if (cek) {
    // ok
  } else {
    // not ok
  }
});
于 2013-01-17T15:42:07.783 に答える
0

Javascript は非同期であるためAJAXfunc、完了するまでプログラムをブロックしません。そのため、JavaScript でイベントとコールバックが頻繁に使用されます。

たとえば、コールバックを含むコードは次のようになります。

function checkForm(callback)
{
    var user = document.forms["LoginForm"]["user"].value;
    var pwd = document.forms["LoginForm"]["pwd"].value;
    AJAXfunc("checkidpass.php?id="+user+"&pass="+pwd,function()
    {
        if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200))
        {
            $("#LoginRes").html(xmlhttp.responseText);
            if (xmlhttp.responseText == "")
                return callback(true);
        }
        return callback(false);
    }); 
}

checkForm( function (result) { 
    var cek = result;
    // Rest of your code for manipulating DOM or something else where you need cek.
} );
于 2013-01-17T15:42:38.633 に答える