SerialPort: close() 方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

注意:此功能在 专用 Web Workers 中可用。

SerialPort.close() 方法是 SerialPort 接口的一部分,它返回一个 Promise,该 Promise 在端口关闭时解析。

语法

js
close()

参数

无。

返回值

Promise

描述

close() 方法会关闭串口,前提是之前被锁定的 SerialPort.readableSerialPort.writable 成员已被解锁,即已为各自的 reader 和 writer 调用了 releaseLock() 方法。

然而,当使用循环从串口设备持续读取数据时,相关的 可读流 始终会被锁定,直到 reader 遇到错误。在这种情况下,调用 reader.cancel() 将强制 reader.read() 立即以 { value: undefined, done: true } 解析,从而允许循环调用 reader.releaseLock()

js
// Without transform streams.

let keepReading = true;
let reader;

async function readUntilClosed() {
  while (port.readable && keepReading) {
    reader = port.readable.getReader();
    try {
      while (true) {
        const { value, done } = await reader.read();
        if (done) {
          // reader.cancel() has been called.
          break;
        }
        // value is a Uint8Array.
        console.log(value);
      }
    } catch (error) {
      // Handle error...
    } finally {
      // Allow the serial port to be closed later.
      reader.releaseLock();
    }
  }

  await port.close();
}

const closedPromise = readUntilClosed();

document.querySelector("button").addEventListener("click", async () => {
  // User clicked a button to close the serial port.
  keepReading = false;
  // Force reader.read() to resolve immediately and subsequently
  // call reader.releaseLock() in the loop example above.
  reader.cancel();
  await closedPromise;
});

在使用 转换流 时,关闭串口会更加复杂。请参阅 关闭串口 以获取指导。

规范

规范
Web Serial API
# dom-serialport-close

浏览器兼容性