即使文件路径无效,web worker 构造函数也不会失败

Posted

技术标签:

【中文标题】即使文件路径无效,web worker 构造函数也不会失败【英文标题】:web worker constructor does not fail even with invalid file path 【发布时间】: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 创建总是成功的。这怎么可能?

【问题讨论】:

【参考方案1】:

这怎么可能?

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

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

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

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

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

...

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

    设 response 为获取请求的结果。

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

    否则,对于每个与 ​​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 或工作人员运行(因此如果它运行它可以发送消息)。

以上是关于即使文件路径无效,web worker 构造函数也不会失败的主要内容,如果未能解决你的问题,请参考以下文章

Web Worker Best Practices

Web Worker Best Practices

ColdFusion CFFILE 重命名属性验证错误,属性源的值无效,即使文件存在且路径正确

Web Workers

“上传路径似乎无效”。 Codeigniter文件上传不起作用[关闭]

在 HTML5 Web Worker 中使用地理定位