0

私の問題は次のとおりです。コンストラクターに新しいXMLHttpRequestオブジェクトを作成するクラスAJAXEngineを作成しました。このクラスには、応答Analyserというメソッドが含まれています。このメソッドは、XMLHttpRequestオブジェクトの「onreadystatechange」が変更されたときに呼び出されます。これで、AJAXEngineの4つのインスタンス=>4つのXMLHttpRequestオブジェクトを作成しました。

これで、AJAXEngineのインスタンスを保持する配列属性dataReqを持つ別のクラスDataRequesterができました。プログラム全体でDataReqeusterのインスタンスは1つだけです。DataRequesterには、callWhenFinishedという関数があります。この関数は、AJAXEngineの関数responseAnalyserによって呼び出され、DataRequesterインスタンスの変数をデクリメントします。

しかし、競合状態が発生すると思います。JavaScriptでそれらをどのように表現できますか?

function AJAXEngine
{
 this.httpReqObj = //create new XMLHttpRequest Object
 this.obj;
 this.func;
}
AJAXEngine.prototype.responseAnalyser = function()
{
 if(this.httpReqObj.readState == 4)
 {
  this.func.call(this.obj);
 }
}
AJAXEngine.prototype.fireReq = function(o, f)
{
 this.obj = o;
 this.func = f;
 // fire ajax req
}

function DataRequester()
{
 this.dataReq = new Array();
 this.test = 4;

 for(var i = 0; i < 4; i ++)
 {
  this.dataReq[i] = new AJAXEngine();
 }
}
DataRequester.prototype.callWhenFinished = function()
{
 this.test --;
}
4

4 に答える 4

1

これが役立つかどうかはわかりませんが、管理された接続プールを作成しようとしているようです。私は数年前にそれをやったが、それでもここではうまくいく:

DP_RequestPoolライブラリ

プールは、定義した数の同時リクエストを使用して、指定した順序でリクエストが行われるようにします(ただし、もちろん、パフォーマンスに基づいて任意の順序で返される場合があります)(システムの制限に従います)。さまざまな目的で複数のプールをインスタンス化できます。

他に何もなければ、これはあなたにいくつかのアイデアを与えるかもしれません。

于 2009-08-17T14:56:47.493 に答える
0

組み込みのスリープ機能が実際に利用できないという理由だけで、JavaScriptでミューテックスを実行することはできません。

参照:同等のJavascriptまたはJqueryスリープ関数はありますか?

また、ミューテックスのブールフラグが別のスレッドと同時にアクセスされていないことを確認する方法はありません。ブール自体にはミューテックスが必要です...など。javascriptで使用できるようにするには、javaのSynchronizedキーワードのようなものが必要ですが、これは単に存在しません。スレッドセーフが心配な状況がありましたが、エラーが発生したがまだ発生していない場合は、とにかく代替プランを使用してコードを使用します。

ですから、私のアドバイスは、エラーが発生した場合、おそらく競合状態が原因ではないということです。

于 2009-08-14T19:55:01.783 に答える
0

その場しのぎのミューテックスを実装する必要があります(ヒューリスティックがboolをチェックし、falseの場合はtrueに設定してから、bodyを実行し、それ以外の場合はsleep(settimeout?)-これは明らかに、誰も実装しないかなり悪いヒューリスティックですスレッドセーフではないためですが、それはとにかく競合状態に対処する方法の一般的な概念です)。

Web上でミューテックスを作成する例が少なくとも1つあると思いますが、詳細には調べていません。いくつかの批判者がいますが、JavaScriptで「スレッドセーフ」を実現する別の方法を知りません。jsの「スレッドセーフ」を実装する必要はありませんでしたが、JavaScriptで競合状態に対処する必要があるかどうかを調べ始めました。

于 2009-08-14T08:56:02.280 に答える
0

まず第一に、ほとんどのAJAX指向のブラウザーは、「同じドメインへの2つの同時リクエストのみ」という規則をサポートしています。したがって、4を開始すると、そのうちの2つが保留になります。

DataReqeuster / singleton /は、変数'test'の配列を持つことができるため、複数のインスタンス間で単一の変数を共有する代わりに、データの複数のインスタンスを作成します。したがって、結果を計算するには、「test」配列を合計する必要があります。

于 2009-08-14T08:16:28.240 に答える