Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
JavaScript 開発者として、プログラムでストリームにデータを書き込むことはとても便利です。この記事では、ストリーム API の書き込み可能なストリームの機能について説明します。
メモ: この記事は、書き込み可能なストリームの用途を理解し、高レベルの概念を理解していることを前提としています。 そうでない場合は、まずストリームの概念と使用方法の概要とストリーム API の概念の記事を読んでから、戻ってくることをお勧めします。
メモ: 読み取り可能なストリームに関する情報を探している場合は、代わりに読み取り可能なストリームの使用や読み取り可能なバイトストリームの使用をご覧ください。
dom-examples/streams リポジトリーには、単純なライターの例(Simple writer example)があります(ライブも参照)。 これは、指定されたメッセージを取得して書き込み可能なストリームに書き込み、ストリームに書き込まれるときに UI に各チャンクを表示し、書き込みが終了すると UI にメッセージ全体を表示します。
書き込み可能なストリーム機能のデモの仕組みを見てみましょう。
書き込み可能なストリームを作成するには、WritableStream() コンストラクターを使用します。 構文は最初は複雑に見えますが、実際にはそれほど悪くはありません。
構文の骨組みは次のようになります。
コンストラクターは引数として 2 つのオブジェクトを取ります。 最初のオブジェクトは必須であり、データの書き込み先の基になるシンクのモデルを JavaScript で作成します。 2 番目のオブジェクトはオプションであり、ストリームに使用するカスタムのキューイング戦略を指定できる ByteLengthQueuingStrategy または CountQueuingStrategy のインスタンスの形式をとります。
次のように最初のオブジェクトには最大 4 つのメンバーを含めることができますが、それらはすべてオプションです。
この例のコンストラクター呼び出しは次のようになります。
実際にストリームにコンテンツを書き込むには、次のように sendMessage() 関数を呼び出して、書き込むメッセージと書き込み先のストリームを渡します。
sendMessage() の定義は次のようになります。
したがって、ここでは、WritableStream.getWriter() を使用してストリームにチャンクを書き込むライターを作成します。 これにより、WritableStreamDefaultWriter インスタンスが作成されます。
また、関連するコンストラクターを使用して新しい TextEncoder インスタンスを作成し、メッセージをチャンクにエンコードしてストリームに入れます。
エンコードされたチャンクを使用して、結果の配列で forEach() を呼び出します。 このブロック内で、WritableStreamDefaultWriter.ready を使用して、ライターに別のチャンクを書き込む準備ができているかどうかを確認します。 ready は、この場合に満たされるプロミスを返します。 その中で、 WritableStreamDefaultWriter.write() を呼び出して、実際にストリームにチャンクを書き込みます。 これにより、前述のように、WritableStream() コンストラクター内で指定された write() メソッドも起動されます。
チャンクがすべて書き込まれた後、最後のチャンクの書き込みが完了し、すべての作業が完了したことを確認するために、もう一度 ready のチェックを実行します。この ready のチェックが完了すると、 WritableStreamDefaultWriter.close() を呼び出してストリームを閉じます。 これにより、前述のように、 WritableStream() コンストラクター内で指定された close() メソッドも起動されます。
WritableStream() 構文の骨組みを学習するときに気づくでしょうが、start()、write()、close() の各メソッドには、オプションで controller 引数を渡すことができます。 これには、 WritableStreamDefaultController インターフェイスのインスタンスが含まれます。 これは、開発者が必要に応じてストリームをさらに制御するために使用できます。
現在、このインターフェイスで使用できるメソッドは WritableStreamDefaultController.error() のみです。 このメソッドを呼び出すと、ストリームとの今後の相互作用でエラーが発生します。これは、アプリの別の部分に問題が発生したときに、エラーをストリームに伝搬させて、システム全体がきれいに失敗するようにしたい場合に便利です。これは、ゴミがストリームに黙って書き込まれる(または同様の悪しき事態になる)危険を冒すのではなく、そのような事態を避けるためです。
上記のように、書き込みが終了すると close() メソッドを呼び出し、WritableStream() コンストラクター内で指定された close() メソッドを起動します。
WritableStreamDefaultWriter.abort() を呼び出してストリームを中止することもできます。
違いは、 close を呼び出すと、ストリームが閉じられる前に、以前にキューに入れられたチャンクが書き込まれ、終了することです。
abort() を呼び出すと、以前にキューに入れられたチャンクはすぐに破棄され、ストリームはエラー状態に移行します。 また、これにより、WritableStream() コンストラクターで指定された abort() メソッドが呼び出されます。
より良いインターネットのための青写真。
このコンテンツの一部は、©1998–2026 個人の mozilla.org 協力者です。コンテンツはクリエイティブ・コモンズ・ライセンスのもとで利用できます。