0

情報をポーリングするために使用している Web ワーカーがあります。

Web ワーカーを開始および停止するためのコードは次のとおりです。

var eftWorker = undefined;

that.StartWorker = function () {
    if (eftWorker === undefined) {
        eftWorker = new Worker('../scripts/ETEL.EftWorker.js');
        eftWorker.addEventListener('message', function(e) {
            EftWorkerResponseHandler(e.data);
        }, false);
        eftWorker.addEventListener('error', function(e) {
            EftWorkerErrorResponseHandler(e);
        }, false);
    }

    eftWorker.postMessage({ cmd: eftCmdStart });
};

that.StopWorker = function () {
    if (eftWorker !== undefined) {
        eftWorker.postMessage({ cmd: eftCmdStop });
        eftWorker.terminate();
    }
    eftWorker = undefined;
};

ワーカーで terminate を呼び出すと、ワーカーがポーリングしているため、未処理のポストメッセージ イベントのバックログがあるようです。

含まれているビューの初期化時と Web ワーカーの終了時に、Web ワーカーを「未定義」に設定しています。後者のため、これらの未処理のイベントは ABORT_ERROR として表示されると思います。Web ワーカーの存在をテストして未処理のイベントを処理し、エラーを回避できるようにするために使用できる中間状態はありますか?

または、終了が呼び出された後にエラーの蓄積を避けるために使用できる別のアプローチはありますか?

4

2 に答える 2

0

これは古いですが、別の答えを探しながら見ていました..

ワーカーに独自の状態と終了を処理させてみませんか? 元の質問では、ワーカーに未処理のリクエストを終了させる方法を尋ねています。そのため、リクエストを終了させ、いつ完了したかを示します。

JavaScriptが次のようなものである場合:

var eftWorker = undefined;

var StartWorker = function () {
    if (eftWorker === undefined) {
        eftWorker = new Worker('/scripts/ETEL.EftWorker.js');
        eftWorker.addEventListener('message', function(e) {
            EftWorkerResponseHandler(e.data);
        }, false);
        eftWorker.addEventListener('error', function (e) {
            EftWorkerErrorResponseHandler(e);
        }, false);

        // i'm assuming we don't want to trigger start multiple times,
        // so this is moved inside the IF.
        eftWorker.postMessage({ cmd: eftCmdStart });
    }
};

that.StopWorker = function () {
    if (eftWorker !== undefined) {
        eftWorker.postMessage({ cmd: eftCmdStop });
    }
};

var EftWorkerResponseHandler = function (msg) {
    try {
        if (msg && msg === 'readyToTerminate') {
            eftWorker.terminate();
            eftWorker = undefined;
        } else {
            // handle other situations.
        }
    } catch (exception) { }
};

そして労働者はこのようなものでした:

;(function(self, undefined) {
    var receivedStopCmd = false;

    self.addEventListener('message', function(e){
        if (e.data.cmd === 'eftCmdStart') {
            // kick off processing here
            EftSendGetRequest('...');
        }

        if (e.data.cmd === 'eftCmdStop') {
            // xhr might be in process, this just updates what
            // the onload function does.
            receivedStopCmd = true;
        }
    }, false);


    var EftSendGetRequest = function(passedUrl) {

        if (xmlHttpReq === undefined) {
            xmlHttpReq = new XMLHttpRequest();
        }

        try {
            xmlHttpReq.open("GET", passedUrl, false);
            xmlHttpReq.onload = function(){
                if (!receivedStopCmd) {
                    // post response and/or keep polling
                    self.postMessage('whatever the message is');
                } else {
                    // (1) stop polling so no more 
                    //     requests are sent..if this 
                    //     requires doing anyhting

                    // (2) Send a message that this worker can be terminated.
                    self.postMessage('readyToTerminate');
                }

            };
            xmlHttpReq.send();
        } catch (e) { }

        return xmlHttpReq.responseText;
    };
})(self);

これにより、XHR はそれ自体を管理できるようになります。もちろん、私はこれを実行しませんでした..これは、質問に対するアプローチの単なる例です。

于 2014-12-11T14:50:17.853 に答える