複数のAJAXリクエストのためのレースの状態
-
16-09-2019 - |
質問
私の問題は次のとおりです。私はクラスAjaxengineを書きました。これは、コンストラクターに新しいXMLHTTPREQUESTオブジェクトを作成します。このクラスには、XMLHTTPREQUESTオブジェクトの「OnreadedStateChange」が変更されたときに呼び出されるRespondeAnalyserと呼ばれるメソッドが含まれています。ここで、Ajaxengineの4つのインスタンス=> 4 xmlhttpRequestオブジェクトの4つのインスタンスを作成しました。
今、私は別のクラスのDatarequesterを持っています。これには、Ajaxengineのインスタンスを保持している配列属性Datareqがあります。プログラム全体にDatareQEusterのインスタンスは1つしかありません! Datarequesterには、CallWhenFinishedという関数があります。この関数は、Ajaxengineの関数RessioningAnalyserによって呼ばれ、Datarquesterインスタンスの変数を減少させます。
しかし、私は人種の条件が起こると思います。 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 --;
}
解決
これが役立つかどうかはわかりませんが、管理された接続プールを作成しようとしているようです。私は数年前に1つをしましたが、ここでもうまくいきます:
プールは、リクエストが提供された順序で行われることを保証します(もちろん、もちろん、パフォーマンスに基づいて任意の順序で返される場合があります)。さまざまな目的で複数のプールをインスタンス化できます。
他に何もなければ、これはあなたにいくつかのアイデアを与えるかもしれません。
他のヒント
まず第一に、Ajax指向のブラウザのほとんどは、「同じドメインへの2つの同時リクエストのみ」をサポートしています。したがって、4を開始した場合、2つはpendingになります。
datareqeuster / singleton / / singleableの「テスト」の配列を持つことができるため、複数のインスタンスで単一変数を共有する代わりに、データの複数のインスタンスを作成します。結果を計算するには、「テスト」配列を合計する必要があります。
間に合わせのミューテックスを実装する必要があります(ヒューリスティックがブールをチェックし、それがfalseであり、体をしてください、そうでなければ睡眠(setimeout?) - これは明らかに、誰も実装しないかなり悪いヒューリスティックです。スレッドは安全ではないので、それはとにかく人種の条件にどのように対処するかという一般的な概念です)。
ウェブ上にミューテックスを作成する例は少なくとも1つありますが、詳細を詳細に調べていません - 批判者がいくつかありますが、JavaScriptで「スレッド安全」を達成する別の方法に気付いていません。 JSの「スレッドセーフティ」を実装する必要はありませんでしたが、JavaScriptの人種条件に対処しなければならないかどうかを検討し始めています。
JavaScriptでMutexを実行することはできません。
見る: 同等のJavaScriptまたはJQuery Sleep機能はありますか?
また、Mutexのブールフラグが別のスレッドと同時にアクセスされないことを保証する方法はありません。ブリアン自体にはミューテックスなどが必要です... JavaScriptで利用できるようにするには、Javaの同期キーワードのようなものが必要になりますが、これは単に存在しません。スレッドの安全性について心配していた状況がありましたが、エラーが発生した場合、それがまだ発生していない場合、コードを代替計画でとにかく使用すると。
ですから、私のアドバイスは、あなたがエラーを得るなら、おそらく人種の状態のためではないということです。
次の記事についてどう思いますか? Googleで見つけたばかりです