如何通过worker.onerror在承诺中冒泡网络工作者错误? [英] How to bubble a web worker error in a promise via worker.onerror?
问题描述
我正在与一位网络工作者打交道,如果发生错误,他需要报告。通常,我可以使用 worker.onerror
侦听从工作程序引发的任何错误。但是,当错误发生在网络工作者的承诺中时,我无法弄清楚如何使错误回溯到 worker.onerror
。
I'm dealing with a web worker that needs to report back if an error has occured. Normally, I can use worker.onerror
to listen to any errors that were thrown from the worker. However, when the error happens in a promise in the web worker, I can't figure out how to bubble the error back up to worker.onerror
.
请使用奇数代码段,因为这似乎是证明工作人员行为的唯一方法。 (工作程序在HTML部分中定义)。
Excuse the odd code snippet, as this seems to be the only way to demonstrate worker behavior. (The worker is defined in the HTML section).
function getInlineJS() {
var js = document.querySelector('[type="javascript/worker"]').textContent;
var blob = new Blob([js], {
"type": "text\/plain"
});
return URL.createObjectURL(blob);
}
var worker = new Worker(getInlineJS());
worker.onerror = function(err) {
document.getElementById('errors').innerHTML +=
"error " + err.message + '\n';
}
worker.onmessage = function (msg) {
console.log("message recieved", msg);
document.getElementById('messages').innerHTML +=
"message " + msg.data + '\n';
}
worker.postMessage("run");
worker.postMessage("promise");
should write "Normal Error and In Promise Error" below and in console (promise error only occurs in console though): <br>
<pre id="errors">
</pre>
messages:
<pre id="messages">
</pre>
<script type="javascript/worker">
self.addEventListener("message", function(e) {
/* demonstration of normal error bubbling to onerror */
if (e.data == 'run') {
throw new Error('Normal Error');
return;
}
new Promise(function(resolve, reject) {
/* some logic that breaks */
throw new Error('In Promise Error');
}).then(function(result) {
}).catch(function(err) {
/* QUESTION: HOW TO GET THIS ERROR OUT OF WORKER? */
/* it logs to console just fine */
console.log("In Promise Catch Error:", err);
/* postMessage doesn't work for some reason */
self.postMessage({error: err});
/* and this doesn't bubble it to worker.onerror */
throw err; /* doesn't bubble!! */
});
});
</script>
如何检索承诺中发生的网络工作者错误?
推荐答案
postMessage由于某种原因无法正常工作
postMessage doesn't work for some reason
这是因为您要返回的是对象而不是字符串,请将其更改为 self.postMessage({error:err.message});
That's because you're returning an object instead of a string, change it to self.postMessage({error: err.message});
对于第二个问题,您可以使用 setTimeout(function(){throw err;});
技巧。可以在此处。
As for your second problem, you can use the setTimeout(function() { throw err; });
trick. More information about the situation and trick can be found here.
function getInlineJS() {
var js = document.querySelector('[type="javascript/worker"]').textContent;
var blob = new Blob([js], {
"type": "text\/plain"
});
return URL.createObjectURL(blob);
}
var worker = new Worker(getInlineJS());
worker.onerror = function(err) {
document.getElementById('errors').innerHTML +=
"error " + err.message + '\n';
}
worker.onmessage = function (msg) {
console.log("message recieved", msg);
document.getElementById('messages').innerHTML +=
"message " + msg.data + '\n';
}
worker.postMessage("run");
worker.postMessage("promise");
should write "Normal Error and In Promise Error" below and in console (promise error only occurs in console though): <br>
<pre id="errors">
</pre>
messages:
<pre id="messages">
</pre>
<script type="javascript/worker">
self.addEventListener("message", function(e) {
/* demonstration of normal error bubbling to onerror */
if (e.data == 'run') {
throw new Error('Normal Error');
return;
}
new Promise(function(resolve, reject) {
/* some logic that breaks */
throw new Error('In Promise Error');
}).then(function(result) {
}).catch(function(err) {
/* it logs to console just fine */
console.log("In Promise Catch Error:", err);
/* postMessage works when you return a string. */
self.postMessage({error: err.message});
setTimeout(function() { throw err; });
});
});
</script>
这篇关于如何通过worker.onerror在承诺中冒泡网络工作者错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!