このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

WritableStream: close() メソッド

Baseline
広く利用可能

この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2022年5月以降、すべてのブラウザーで利用可能です。

close() は WritableStream インターフェイスのメソッドで、関連付けられたストリームを閉じます。このメソッドが呼び出される前に書き込まれたチャンクはすべて、返されたプロミスが履行される前に送信されます。

これは WritableStreamDefaultWriter を getWriter() で取得し、 close() を呼び付けるのと同じです。

構文

js
close()

引数

なし。

返値

Promise で、閉じる前に残りのチャンクがすべて正常に書き込まれた場合は undefined で履行され、処理中に問題が発生した場合はエラーで拒否されます。

例外

TypeError

閉じようとしているストリームがロックされています。

例

次の例は WritableStream のいくつかの機能を示しています。これはカスタムシンクと、 API が提供するキューイング戦略による WritableStream の作成を示しています。次に sendMessage() という関数を呼び出して、新しく作成したストリームと文字列を渡します。この関数の内部では、ストリームの getWriter() メソッドを呼び出して WritableStreamDefaultWriter のインスタンスを返します。 forEach() 呼び出しは、文字列の各チャンクをストリームに書き込むために使用されます。最後に、 write() と close() はチャンクとストリームの成功と失敗を処理するプロミスを返します。なお、ストリーム自体で close() を呼び出すには、 defaultWriter.releaseLock(); を使用してライターを切断する必要があります。

js
function sendMessage(message, writableStream) {
  // defaultWriter is of type WritableStreamDefaultWriter
  const defaultWriter = writableStream.getWriter();
  const encoder = new TextEncoder();
  const encoded = encoder.encode(message, { stream: true });
  encoded.forEach((chunk) => {
    defaultWriter.ready
      .then(() => {
        defaultWriter.write(chunk);
      })
      .catch((err) => {
        log("Chunk error:", err);
      });
  });

  // Call ready again to ensure that all chunks are written
  //   before closing the writer.
  defaultWriter.ready
    .then(() => {
      defaultWriter.releaseLock();
      writableStream.close();
    })
    .then(() => {
      log("All chunks written / stream closed.");
    })
    .catch((err) => {
      log("Stream error:", err);
    });
}

const decoder = new TextDecoder("utf-8");
const queuingStrategy = new CountQueuingStrategy({ highWaterMark: 1 });
let result = "";
const writableStream = new WritableStream(
  {
    // Implement the sink
    write(chunk) {
      return new Promise((resolve, reject) => {
        const buffer = new ArrayBuffer(1);
        const view = new Uint8Array(buffer);
        view[0] = chunk;
        const decoded = decoder.decode(view, { stream: true });
        const listItem = document.createElement("li");
        result += decoded;
        resolve();
      });
    },
    close() {
      const listItem = document.createElement("li");
      log(`[MESSAGE RECEIVED] ${result}`);
    },
    abort(err) {
      log("Sink error:", err);
    },
  },
  queuingStrategy,
);

log("Sending 'Hello, world.' message.");
sendMessage("Hello, world.", writableStream);

仕様書

仕様書
Streams
# ref-for-ws-close①

ブラウザーの互換性