私は日々のオンライン商取引の中で企業を支援するためにクローズドシステムWebアプリケーションに取り組んでいます。つまり、一方では一般に公開されず、流暢な仕事経験を維持しながら大量のデータを処理する必要があります。2人のJSウェブワーカーの同時実行:1人がスタックする
これは、私がJSのWebワーカーに目を向けて、あらゆる種類のデータベースアクセスとデータ読み込みをバックグラウンドで実行する理由です。 私の理解は、メインのUI /メインJSが中断されずにいるだけでなく、異なるWebワーカーが互いに干渉することなく動作することです。
私は今、次のセットアップを持っている:
mainJS:pageload上で動作する機能statusCheck:労働者である
function statusCheck() {
if(typeof(w__statusCheck) == "undefined") {
var w__statusCheck = new Worker("...statusCheck.js");
w__statusCheck.postMessage("go");
w__statusCheck.onmessage = function(e) {
var message = JSON.parse(e.data);
if(message.text!=undefined) displayMessage(message.text);
}
}
statusCheck.jsは、単純にこのように書きます:
function checkStatus() {
console.log("statusCheck started");
// I will leave standard parts out:
// creating and testing the ajax variable against different browsers
ajaxRequest.onreadystatechange = function() {
if(ajaxRequest.readyState == 4) {
self.postMessage(ajaxRequest.responseText);
var timer;
timer = self.setTimeout(function(){
checkStatus();
}, 1000);
}
}
ajaxRequest.open("GET", "...worker_statusCheck.php", true);
ajaxRequest.send(null);
}
this.onmessage = function(e){
checkStatus();
};
ご覧のとおり、これは毎秒それ自身を再起動します。インターヴォールは生産が長くなるかもしれません。 worker_statusCheck.phpは、単にデータベースとは異なるものを取得し、それらをJSONオブジェクトに編成して、私にシステムステータスを与えます。
これは美しく機能します。
今、私は効果的にアクションを実行するために、いくつかのPHPを呼び出すためのリンクをクリックすることにより開始を取得することになっている別のワーカーがあります。特定のリンク上でこれをすべてのクリックで mainJS loadWorker
function loadWorker(url="") {
console.log("loadWorker started");
if(url!="") {
var uniqueID = "XXX" // creating a random ID based on timestamp and Math.random()
if(typeof(window[uniqueID]) == "undefined") {
var variables = { ajaxURL: url };
window[uniqueID] = new Worker("....loadWorker.js");
window[uniqueID].postMessage(JSON.stringify(variables));
window[uniqueID].onmessage = function(e) {
var message = JSON.parse(e.data);
if(message["success"]!=undefined) {
variables["close"] = "yes";
window[uniqueID].postMessage(JSON.stringify(variables));
}
}
}
を一意の名前のワーカーを作成し、実行し、データを受け取り、ワーカーにclose()
と伝えます。
PHPはまた、その事を行い、長い手順の各ステップの後に進捗状況の更新をDBに書き込みます。これらの進捗状況の更新は、上記の繰り返しステータスチェックでDBから取得します。
ここで、タイムスタンプ付きのDBのエントリを見ることができるので、それぞれの時間に書き込まれることが分かります。 したがって、両方の作業者が仕事をして確実に実行されます。しかし私は、手動(無作為に指定された)作業者を開始するたびに、statusCheckは実際に実行を停止することに気付きました。それはちょうど立ち往生する...私は両方の労働者からのコンソールの出力でこれを確認することができた。したがって、スタックされているようなメインJSではなく、statusCheckは実際には一時停止し、loadWorkerが完了すると再開します。
ここでは何か基本的なものがありませんか?私がこのウェブワーカーのコンセプトに慣れて以来、どんな洞察も高く評価されます。
ありがとう:)
これは、最初からコンソールで簡単に見ることができるものです... –
そうですか?どうやって?私はJSと文書メッセージしか見ることができません。 PHPの出力はありません。また、どこにもエラーはありませんでした。ただの遅れ。たぶん私はあなたのように啓発されていないので、おそらくここで私を助けることができます... –
コンソールを調べると、要求の1つがロードされていて、データを受信していないことがわかります。それはあなたがサーバーとの通信に問題があることを知るのに十分なヒントを与えてくれるでしょうし、Webワーカーに関連していないことを簡単にチェックできます。あなたはまだ問題が何であるか把握する必要がありますが、少なくともクリスタルボールなしでは答えられない質問は投稿しません。また、「*あなたのように悟りがないかもしれない」という言葉は、失礼な風刺として頻繁に使用されるので、熱い議論を避けるためにインターネット上で避けるほうが良いです。 –