0

「ネイティブな」同期 ajax 呼び出しはブラウザーのユーザー インターフェイスをブロックするため、現実世界のほとんどのケースには適合しません (少なくとも私の場合)。

非同期 (非ブロッキング) ajax call を使用して同期 (ブロッキング) ajax 呼び出しをシミュレートする方法があるかどうかを知りたいので、結果は同期呼び出しになりますが、UI をブロックすることはありません。

次のコードはそれをよりよく説明しています:

function do_synchronous_ajax_call(url){
    // Performs an asynchronous ajax call, which doesn't block the UI, BUT, blocks this current script execution
}

var xyz = do_synchronous_ajax_call("http://...."); // Call is blocking until the inner ajax call returns
// Process `xyz` from here

ご覧のとおり、上記では、UI をブロックしない、ある種の「合成」同期 ajax 呼び出しが必要です。

Javascript はマルチスレッドをサポートしていないため、それは不可能かもしれませんが、質問する価値はあります。

これは、主題の 3 番目の質問です。
これらの質問は、現在の質問に続きました:
ajax 呼び出しをブロックする方法 (ブロックしたい)
は、同期 (ブロック) ajax 呼び出しでブラウザーの UI をブロックできますか?

4

3 に答える 3

0

UI を更新するには、実行をブラウザーに戻す必要があります。これを行う唯一の方法は、非同期コード (またはすぐに戻るコード) を使用することです。

于 2012-08-31T12:02:27.653 に答える
0

代わりに何もできないのに、なぜ何かを「ブロック」するのでしょうか? あなたは実際には非同期フローを理解していないようです。「待つ」のではなく、データが利用可能になったときに何をすべきかを宣言します。コードの残りの部分を含むコールバックを使用してリクエストを設定し、リクエストをディスパッチして Javascript から戻り、コードが再び機能するまでブラウザに独自のタスクを実行させます。

于 2012-08-31T12:04:21.297 に答える
0

グローバルに利用可能なロックを設定できます。グローバル変数を使用している場合でも、グローバル レベルでオプションやオブジェクトを保持するオブジェクト セットがある場合でも、単純にブール ロックを使用できます。

function do_ajax_call(url)
{
    if (!locked)
    {
        // yadda yadda yadda
        locked = true;

        myxmlhttpobj.onreadystatechange = HandleCallback;
    }
}

function HandleCallback() {
    if (myxmlhttpobj.readyState==4 && myxmlhttpobj.status==200)
    {
         // more yadda yadda
    }

    locked = false;
}

jQuery AJAXに切り替えると、「done」イベントと組み合わせて同様のロック メカニズムを適用できる「beforeSend」を含むフレームワーク イベントとメソッドのホスト全体の利点が得られます。

于 2012-08-31T12:10:17.563 に答える