0

私はいくつかの JavaScript コードを持っています (以下)。いずれの場合も、ループの最後で $sid は 0 になるはずですが、"alert($sid)" は常に 200 を返します。コードにエラーが見つかりません。手伝っていただけませんか?

前もって感謝します。

$sid = 200;
$canAppend = 0;
$iPage = 1;

while ($sid && $canAppend==0 && $iPage==1) {
    alert($sid);
    $.ajax({
    url: "tmp/result1.html",
    success: function(html)
    {
        if(html)
        {
            $("#inzeraty").append(html);
            $('div#loadmoreajaxloader').hide();
            $sid = 0;
        }            
    },
    error: function()
        {
            $sid = 0;
        }
    });
}
4

2 に答える 2

2

問題は、ajax 呼び出しが非同期であることです。JavaScript はこれをサーバーに要求し、次のコード行に進みます。JavaScript が while ループの実行を完了するまで、成功およびエラーのコールバック関数は呼び出されません。

さらに、コードの構造はまったく意味がありません (失礼なことを言うつもりはありません)。$canAppend および $iPage 変数は使用または変更されません。このコードが行うことは、ループに入り、決して終了しないことです。どうしてこれなの?$.ajax() の呼び出しが非ブロッキングであるためです。リクエストが完了するまで待機せず、続行します。JavaScript は (本質的に) シングル スレッドであるため、エラーと成功のコールバックは、現在の実行プロセスが完了するまで実行できません。成功ハンドラとエラー ハンドラを実行できないため、$sid を設定できません。$sid を送信できないため、コードは while ループを終了できません。

コードが実際にwhileループをどのように利用しているかわかりません。代わりに、$.ajax() 関数を呼び出して、成功ハンドラーで結果を処理します。何が起こっているのかをよりよく理解するのに役立つサイズを試してみてください。

$sid = 200;

alert("$sid is 200: " + $sid); // you'll see this first

$.ajax({
    url: "tmp/result1.html",
    success: function(html)
    {
        if(html)
        {
            $("#inzeraty").append(html);
            $('div#loadmoreajaxloader').hide();
            $sid = 0;
            alert("$sid is now 0: " + $sid); // you'll see this third if html is not false
        } else {
            alert("$sid is STILL 200: " + $sid); // you'll see this third if html is false
        }
    },
    error: function()
    {
        $sid = 0;
        alert("you got an error, but $sid is now 0: " + $sid); // you'll see this third if there's an error
    }
});

alert("$sid is still 200: " + $sid); // you'll see this second
于 2013-03-04T19:43:23.873 に答える
-1

デフォルトでは、ajax呼び出しは非同期であり、成功またはエラー関数は$.ajaxがtmp/result1.htmlを取得するまで延期されます。あなたの場合、whileループがハンドを維持し、$ sidが200に等しいままであり、ajax呼び出しを積み上げ続けるため、それらは永久に延期されます。

簡単な修正は、ajax呼び出しを同期させることです。

$.ajax({
  url: "tmp/result1.html",
  async: false,
  success: function(html)
// etc.

whileループとajaxが混在しないようにコードを書き直すことをお勧めします(ただし、特定のコンテキストはわかりません)。

于 2013-03-04T19:34:14.137 に答える