我们可以使用来自 Webworker 的 JavaScript FileSystemAPI 吗?

问题描述

我们可以使用来自网络工作者的 JavaScript FileSystemAPI 吗?

https://developer.mozilla.org/en-US/docs/Web/API/FileSystem

在他们的文档中,他们没有提到任何内容,但在使用它时没有定义其抛出窗口。

谢谢!

解决方法

不是真的...

曾经有一个 self.webkitRequestFileSystemSync() 方法可以在 Worker 范围内访问,但它已被弃用。并且您从 drop 事件中获得的 FileSystem 对象无法序列化,因此无法从主线程发布到 Worker。

但是,我怀疑您并不是真的想使用 FileSystem API,它在 Web 上下文中并不是很有用,而是您可能更喜欢 File System Access API,它使您的页面可以访问用户的文件系统(即使它仍然只在基于 Chromium 的浏览器中可用)。

但是从 Web Worker 使用这个 API 也并不简单。
为了向文件系统访问 API 发出请求,我们需要处理用户手势。 Web Workers 无权访问 UI,因此他们也无权访问 UI 事件 (yet)。

所以我们必须从 UI 线程发出请求。

然而,与 FileSystem 对象相反,FileSystemHandles 是可序列化的并且可以通过 postMessage() 发布,因此一旦获得句柄,您就可以将其发布给您的工作人员并从那里开始工作。

在 UI 线程中

btn.onclick = async (evt) => {
  const dirHandle = await showDirectoryPicker();
  worker.postMessage( dirHandle );
};

然后在 Worker 线程中,您可以在 MesageEvent.data 中接收该句柄,并像在主线程中一样使用它。

这是一个 live demo 和它的 source

,

Webworkers global object 名称是 global,而不是 window。 并且没有文件系统 API

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...