Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我在web worker上调用terminate时,它处于什么状态?_Javascript_Jquery_State_Web Worker_Terminate - Fatal编程技术网

Javascript 当我在web worker上调用terminate时,它处于什么状态?

Javascript 当我在web worker上调用terminate时,它处于什么状态?,javascript,jquery,state,web-worker,terminate,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', fu

我有一个网络工作者,我用它来调查信息

以下是启动和停止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;
};
当我对worker调用terminate时,因为worker正在轮询,所以似乎有未处理的postmessage事件积压

在初始化包含视图和终止web worker时,我将web worker设置为“未定义”。我认为,由于后者,这些未处理的事件显示为ABORT_错误。 是否有一个中间状态可以用来测试web worker的存在,以便允许它处理未完成的事件,从而避免错误


或者,是否有一种不同的方法可以用来避免调用terminate后的错误积累?

以下是我的问题解决方案

我在一个单独的变量中记录worker的状态,以便使其保持活动状态,以处理导致错误的未完成消息

此外,我还捕获并丢弃在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;
};

这是旧的,但我看着它,同时寻找一个不同的答案

为什么不让工人处理自己的状态和终止?最初的问题是如何让员工完成未完成的请求。因此,让它完成它的请求,并指示何时完成

如果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);
工人是这样的:

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自行管理。当然,我没有运行这个。。这只是我在这个问题上采取的方法的一个例子。

有趣的方法。但如何追踪被解雇工人的状态仍然是个问题。导致行
//eftWorker=未定义的错误仍在代码中注释。