0

for非同期操作の同期中にブラウザーをwhileハングさせないようにすることは可能ですか?

XMLHttpRequest同期はUIイベントのみをブロックしますが、ブラウザを完全にハングさせるわけではないので、私はこれを求めています. ループと同じ動作をしたいと思います。

4

2 に答える 2

2

問題について少し間違っているのではないかと思います。JavaScript はシングル スレッドであるため、条件の待機中に何かを「ブロック」したくはありません。代わりに、コールバックを利用して、実行中の処理が完了したことを関数に警告する必要があります。

たとえば、次の一般的なシナリオがあるとします。ページにデータを検証する「送信」ボタンがあり、ユーザーが続行するかどうかを尋ね、データを送信します。コードは次のようになると想像できます。

function clickSubmit() {
    //validate data
    //show confirmation dialog
    //block until "OK" or "Cancel" is clicked
    //if OK, submit
    //else cancel
}

もちろん、関数がブロックされている間はユーザーが [OK] または [キャンセル] をクリックできないため、実際には機能しません。代わりに、コールバックを使用して状況を処理します。このようなもの:

function clickSubmit() {
    //validate data
    dialogOK.onclick = function () {
        //submit
    }
    dialogCancel.onclick = function () {
        //cancel
    }
    //show confirmation dialog
}

そうすれば、関数はダイアログが表示されるとすぐに唯一の JS 実行スレッドを放棄しますが、ユーザーが確認またはキャンセルを選択すると、実行を効果的に再開します。クロージャ スコープを使用すると、永続的な実行コンテキストを作成できるため、関数が他のタスクに CPU を割り当てている場合でも、データの「追跡を失う」ことはありません。

実生活では、特定の状況に基づいて微調整が必​​要になる場合がありますが、これは、必要と思われる機能を実現するために使用できる一般的な構造です。

うまくいけば、私はあなたの質問を理解しました。詳細については少しまばらです。

ちなみに、XMLHttpRequestそれはブラウザのネイティブ機能を利用することです。ただし、応答を待っている間、実際に「ブロック」する必要はありません。ブラウザー エンジンに HTTP 要求を送信するよう指示し、応答が表示されたら通知するだけです。AJAX が実際に動作する方法と非常によく似ています。

于 2012-12-16T16:28:59.120 に答える
0

はい、「ハング」を防ぐためにブラウザに定期的に制御を与えることによってsetTimeout、およびを使用することは可能です。jQuery ASyncプラグインsetIntervalを見ることができます

于 2012-12-16T16:02:07.977 に答える