在下面的例子中,Web Worker的代码存在错误(未定义的引用),但是try {...} catch(e) {...} 并没有捕获到太多信息。消息“为什么我在这里?”出现在控制台上。
HTML文件:
HTML文件:
<html>
<body>
<script type="text/javascript">
var worker;
try {
worker = new Worker("foo.js");
console.log('Why am I here ?');
} catch (e) {
console.log('Error creating the worker.');
}
// No matter what, an object "worker" will created during the call to Worker()
// How to test that all went well
var worker_failed = false;
worker.addEventListener("error",
function(e) { worker_failed = true },
false);
// Is it correct to assume that "worker" is created asynchronously, and that checking
// that creation went well should not be sequential and the test below is not
// the way to do it ?
if ( worker_failed ) {
// Worker("foo.js") failed, switch to plan B
}
</script>
</body>
</html>
网络工作者 (foo.js):
foobar = 2 + baz; // fails here (baz is undefined)
onmessage = function(e) {
var data = e.data;
postMessage(data);
};
error
事件,并将信息传递给控制台。 - jbalsastry{} catch{}
语句块捕获。你所遇到的是运行时错误。JS 是一种解释性语言,因此像你遇到的这种错误直到执行时才会被捕获。因此,当工作者被执行(在另一个线程中)时抛出错误。最后,根据规范,任何未捕获的错误都将使用onError
API 传递给父 URL。 - jbalsasWorker(“foo.js”)
时对“foo.js”的评估是创建工作者以及该文件中的顶级组件作为工作者的方法和属性。但事实并非如此。它们局部于工作者,这一点必须与我头脑中的其他概念相结合。问题的起源是,在尝试使用其关联的Javascript代码创建一个Web Worker之前,我无法猜测浏览器是否实现了我需要的内容。类似测试if(window.Worker){worker = new Worker(“foo.js”)} else {<plan B>}
。 - lgautier