【问题标题】:web worker constructor does not fail even with invalid file path即使文件路径无效,web worker 构造函数也不会失败
【发布时间】:2018-05-15 21:33:27
【问题描述】:

我在与 webpack 3 捆绑的 web 文件中有此代码:

let _worker = new Worker("x.js")
_worker.addEventListener('message', (event) => {
    resolve(event.data as any)
});

无论我将什么路径传递给构造函数,worker 创建总是成功的。这怎么可能?

【问题讨论】:

    标签: javascript webpack web-worker


    【解决方案1】:

    这怎么可能?

    因为它是异步的。您不希望您的主 JavaScript 线程坐在那里,被阻塞,等待浏览器从服务器获取脚本文件。所以它是异步完成的。

    如果您侦听 worker 的 error 事件,您将收到使用无效路径创建的 worker。

    这在标记为 “当调用 Worker(scriptURL) 构造函数时,用户代理必须运行以下步骤:”的步骤列表中包含in the spec,其中没有列出任何关于获取 URL 的浏览器。

    最后一步是run a worker,开头是这样的:

    1. 创建单独的并行执行环境(即单独的线程或进程或等效结构),并在该上下文中运行其余步骤。

    ...

    1. 令request为url为url的新请求...

    2. 设 response 为获取请求的结果。

    3. 如果响应响应的状态是正常状态...

      否则,对于每个与 ​​worker 全局范围关联的 Worker 或 SharedWorker 对象,排队一个任务以在该对象上触发一个名为 error 的简单事件。中止这些步骤。

    【讨论】:

    • 但是我曾经在路径无效时在浏览器控制台中收到错误(例如:找不到路径 xxx”);现在不会发生这种情况
    • @prmph:您的服务器是否设置为对无效 URL 提供默认响应?如果我在 SO 上执行new Worker("fooalskdjflaskdf.js").onerror = function(e) { console.log("failed", e); };,我会从网络工作者那里得到错误,然后是Uncaught SyntaxError: Unexpected token <,因为 SO 会响应一个页面(而不是应该的 404)。但是,如果我在服务器响应 404 的站点上执行此操作,我会在控制台中收到错误消息。另请注意,大多数控制台都有过滤选项,您可能错误地打开了一个。无论如何,如果响应不是有效的 JavaScript,您将收到 worker 错误。
    • 那么如何创建一个worker,并且只有在确保它被正确创建后才能继续呢?你能发布一个简短的 sn-p 来说明这一点吗?
    • @prmph:我会通过处理error 事件和message 事件来做到这一点,并让工作人员在加载和初始化时发送一条消息。你可能会抛出一个超时,但我希望 error 或工作人员运行(因此如果它运行它可以发送消息)。
    猜你喜欢
    • 1970-01-01
    • 2011-10-04
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多