0

私は知っています、私は知っています、それは良いデザインではありません。ノンブロッキングの setTimeout または setInterval はより良いアプローチですが、ノンブロッキングを実装するには、私のシナリオでコールバック ポイントを持つようにコード全体をリファクタリングする必要があります。説明させてください:

  1. キャッシュ (ストレージ) からオブジェクトをフェッチすることを目的とした関数があります
  2. オブジェクトが利用可能な場合、私はそれを取ります
  3. オブジェクトが利用できない場合は、それを要求し、有効期限カウンター/時間でポーリングして利用可能になるまで待ちます。ある時点で(それほど遠くない)利用可能になり、発信者に戻ります

コールチェーン (スタック) が非常に深く複雑であり、すべてのコードをリファクタリングして非同期コールバックなどを使用することは不可能であるため、コールバックを実装できません。この特定のケースでは、単一のスレッド化されたブロッキング ループが本当に必要です。

ここで質問が来ます:

カウンターで単純な for ループを使用したいだけではありません。これにより、CPU サイクルが過度に消費され、コンピューターのファンが (たとえ数秒間であっても) 起動します。次のようなブロッキング アプローチとして使用できる、最も遅い JavaScript コマンド (またはコマンドのセット) を探しています。

while ( needToContinue ) {
    slowestCommandOrFunction();
    needToContinue = checkIfNeedToContinue();
}
4

2 に答える 2

2

同期したいのはajaxリクエストのようです。の 3 番目の引数でこれを行うことができますXMLHttpRequest.open

xhr.open('GET', url, false);

ただし、時間をかけてコードをリファクタリングすることをお勧めします。

于 2013-02-23T14:41:09.147 に答える
1

リファクタリングを高速化したい場合は、streamlinejsを使用できます。基本的には、streamlinejsを使用してJSをコンパイルする必要がありますが、代わりに、すべてのパラメーターリストにアンダースコアを付けるだけで、同期関数を非同期にすることができます。例えば

function foo() {
  for (var i=0; i<10; i++) {
    bar()
  }
}

単になります

function foo(_) {
  for (var i=0; i<10; i++) {
    bar(_)
  }
}

また、nodejsでサーバー側のJavaScriptを使用している場合は、ファイバーを使用できます。

于 2013-02-23T14:44:41.943 に答える