3

同期リクエストの数を非同期リクエストとして単純にカプセル化することができます。

以下のコード内の「func」パラメーターには、たとえば、複数の同期要求を順番に含めることができます。これにより、DOM をデータに作用する媒体として使用するのとは対照的に、データに対するより強力な権限が与えられるはずです。(他の方法はありますか?JavaScriptを使うのは久しぶりです)

function asyncModule(func)
{
    "use strict";
    var t, args;
    t = func.timeout === undefined ? 1 : func.timeout;
    args = Array.prototype.slice.call(arguments, 1);
    setTimeout(function () {
        func.apply(null, args);
    }, t);
}

これが仕様の内容であるため、ここで私の推論に何か問題があるに違いありません。

ワーカー外の同期 XMLHttpRequest は、エンド ユーザーのエクスペリエンスに悪影響を与えるため、Web プラットフォームから削除される過程にあります。(これは何年もかかる長いプロセスです。) JavaScript グローバル環境がドキュメント環境である場合、開発者は async 引数に false を渡してはなりません。ユーザー エージェントは、開発者ツールでそのような使用法について警告することを強くお勧めします。また、発生時に InvalidAccessError 例外をスローして実験する場合があります。@ https://xhr.spec.whatwg.org/

リクエストで非同期を回避し、代わりに非同期関数内で同期リクエストをラップすることをお勧めします。

これが主な質問とフォローアップです。

  • 私が示した例に何か問題がありますか?

そうでない場合:

  • 要求を非同期にすることをどのように正しい解決策にしていますか?

言うまでもなく、私の「主張」が単に間違っているか半分真実である場合は、それを暴く自由があります。私はこれについて混乱しています、私はあなたにそれを与えます。

ブラウザではなく端末で javaScript をテストしていることに注意してください。GO プログラミング言語内で Web サーバーを使用しましたが、すべて正常に動作しているようです。この仕様のヒントが得られるのは、ブラウザー内でコードをテストするまではありません。

4

1 に答える 1

0

この回答は編集されています。

はい、私の推論は間違っていました!

考える角度は2つあります。javascriptで非同期とは実際にはどういう意味ですか? 1 つの非同期呼び出しで別の非同期呼び出しを停止できますか?

JavaScriptの非同期は、スクリプトが複数のコールスタックを持つインターリーブ/交互プロセスで実行されることを意味するものではありません. これは、機会があれば完全に引き継ぐグローバルな時間指定の延期/延期コマンドのようなものです。これは、非同期呼び出しがブロックされる可能性があり、非ブロックの「async:true」部分が xhttprequest の実装方法に基づく「トリック」にすぎないことを意味します。

これは、setTimeout 内に同期リクエストをカプセル化すると、失敗したリクエストを待機して、他の無関係な非同期リクエストをブロックすることになる可能性があることを意味します。「async:true」機能は、その状態値に基づいてのみ実行されます。

これは、古いブラウザーのサポートでは、リクエストをチェーンするか、別のリクエストに依存する複数のリクエストを実行する必要がある場合に DOM を媒体として使用する必要があることを意味します..うーん...

幸運なことに、Javascript には現在スレッドがあります。これで、スレッドを使用して、複数の相関する要求を同期してきれいにカプセル化することができます。(またはその他のバックグラウンド タスク)

要するに: ブラウザーは、ワーカー内にある場合、要求を同期して実行することに問題はありません。ブラウザーはまだ OS になっていませんが、OS に近づいています。

PSこの答えは、多かれ少なかれ試行錯誤によるものです。Firefox に関するいくつかのテスト ケースを作成し、非同期要求が他の非同期要求を停止することを確認しました。私は単にその観察から推測しています。まだ何かが足りない場合に備えて、私は自分の答えを受け入れません。

EDIT(繰り返します..)実際には、xhttp.ontimeoutと一緒にxhttp.timeoutを使用できる場合があります。Timeout XMLHttpRequestを参照してください 。これは、setTimeout を抽象化し、それをスケジューラとして使用すると、不正なリクエストから回復できることを意味します。

// Simple example
function runSchedular(s)
{
    setTimeout(function() {
        if (s.ptr < callQue.length) {
            // Handles rescheduling if needed by pushing the que.
            s = s.callQue[s.ptr++](s);
        } else {
            s.ptr = 0;
            s.callQue = [];
            s.t = 200;
        }
        runSchedular(s);
    }, s.t);
}
于 2015-12-03T19:38:35.460 に答える