当我在我的网络工作者呼叫终止时它处于什么状态?

时间:2013-09-04 13:46:04

标签: javascript jquery state web-worker terminate

我有一个网络工作者,我正在用它来查询信息。

以下是启动和停止Web worker的代码:

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;
};

当我打电话给工人终止时,因为工人正在进行投票,似乎有未处理的邮件消息积压。

我在初始化包含视图和Web工作者终止时将Web worker设置为“undefined”。我相信由于后者,那些未处理的事件显示为ABORT_ERROR。 是否有一个中间状态可用于测试Web worker的存在,以便我可以允许它处理未完成的事件,从而避免错误?

或者是否有一种不同的方法可以用来避免在终止被调用之后累积错误?

2 个答案:

答案 0 :(得分:0)

这是我解决问题的方法。

我正在一个单独的变量中记录worker的状态,以便我可以保持它活着来处理导致错误的未完成消息。

此外,我正在捕获并丢弃工作人员自身内部产生的任何错误。

var eftWorker = undefined;
var eftWorkerState = undefined;

var workerStateStarted = 'started';
var workerStateStopped = 'stopped';

var StartWorker = function () {
    if (eftWorker === undefined | eftWorkerState !== workerStateStarted) {
        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 });
    eftWorkerState = workerStateStarted;
};

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

var EftWorkerResponseHandler = function (msg) {
    try {
        if (eftWorkerState === workerStateStarted) {
            if (msg != '' && msg !== undefined) {
                var parser = new DOMParser();
                var xmlDoc = parser.parseFromString(msg, 'text/xml');

                var json = $.xmlToJSON(xmlDoc);

                AlterPaymentUIAccordingToEftWorkerStatus(json);
            }
        }
    } catch (exception) { }
};

这是来自负责发回状态消息的工作人员的代码。

EftSendGetRequest = function(passedUrl) {

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

    try {
        xmlHttpReq.open("GET", passedUrl, false);
        xmlHttpReq.send();
    } catch (e) { }

    return xmlHttpReq.responseText;
};

答案 1 :(得分: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自我管理。我当然没有这样做..它只是我将在这个问题上采取的方法的一个例子。