まず、Web 上でデータがどのように送信されるかを説明しましょう。単一の連続ストリームとして送信されるわけではありません。代わりに、より小さなチャンクに分割されます。受信側では、すべてのデータを受信した後、コンシューマまたはアプリケーションがこれらのチャンクを正しい順序と形式で再組み立てする必要があります。このプロセスは、画像、ビデオ、その他の比較的大きなデータ型に対して自動的に行われます。
つまり、Streams API が提供するのは、完全なデータが利用可能になるのを待つ代わりに、
まず、Fetch API を使用してデータを受信する従来の方法と、新しい Streams API アプローチを比較してみましょう。フェッチ API を使用した従来のアプローチ
fetch("url") .then((response) => { // Note that there is a middle step before we receive the final data // Let's see what we actually receive console.log(response.body); return response.text(); }) .then((data) => { // Perform operations with the data });この例では、response.body は ReadableStream オブジェクトです:
fetch("url") .then((response) => { // Note that there is a middle step before we receive the final data // Let's see what we actually receive console.log(response.body); return response.text(); }) .then((data) => { // Perform operations with the data });ここでは、Streams API の最初のコンポーネントである ReadableStream に遭遇します。 ReadableStream コンストラクターは、読み取り可能なストリーム オブジェクトを作成して返します。これにより、ストリーミング データをより効率的に処理できるようになります。このコンストラクターを使用すると、データセット全体が利用可能になるのを待つのではなく、データをチャンク単位で管理できます。
fetch("url") .then((response) => { // Note that there is a middle step before we receive the final data // Let's see what we actually receive console.log(response.body); return response.text(); }) .then((data) => { // Perform operations with the data });リアルタイムで送信されるデータにアクセスするには、オブジェクトを処理する関数を実装する必要があります。この関数は次のようにする必要があります:
1 ReadableStream をプロミスとして受信します。
ReadableStream の詳細
interface ReadableStreamインターフェイス ReadableStreamDefaultReader{ readonly locked: boolean; cancel(reason?: any): Promise ; getReader(options: { mode: "byob" }): ReadableStreamBYOBReader; getReader(): ReadableStreamDefaultReader ; getReader(options?: ReadableStreamGetReaderOptions): ReadableStreamReader ; pipeThrough ( transform: ReadableWritablePair , options?: StreamPipeOptions ): ReadableStream ; pipeTo( destination: WritableStream , options?: StreamPipeOptions ): Promise ; tee(): [ReadableStream , ReadableStream ]; }
fetch("url") .then((response) => { // Note that there is a middle step before we receive the final data // Let's see what we actually receive console.log(response.body); return response.text(); }) .then((data) => { // Perform operations with the data });ストリームを操作するには、ReadableStreamDefaultReader を返す getReader() を使用します。
これは、特定のユーザー向けに PGN 形式 (テキストと考えてください) のゲーム用に Lichess.org の API にリクエストを行う例です。最終結果はテキストで表示される必要があります。fetch("https://lichess.org/api/games/user/gg").then((response) => { console.log(応答); const readablestream = 応答.body; console.log(読み取り可能なストリーム); const リーダー = readablestream.getReader(); コンソール.ログ(リーダー); });
fetch("url") .then((response) => { // Note that there is a middle step before we receive the final data // Let's see what we actually receive console.log(response.body); return response.text(); }) .then((data) => { // Perform operations with the data });出力:
fetch("url") .then((response) => { // Note that there is a middle step before we receive the final data // Let's see what we actually receive console.log(response.body); return response.text(); }) .then((data) => { // Perform operations with the data });ReadableStream.locked = true の場合、getReader() がエラーをスローするため、同時に複数のリーダーを持つことはできないことに注意してください。そのため、リーダーを変更したい場合は、まず ReadableStreamDefaultReader を使用してロックを解放する必要があります。リリースロック()
fetch("url") .then((response) => { // Note that there is a middle step before we receive the final data // Let's see what we actually receive console.log(response.body); return response.text(); }) .then((data) => { // Perform operations with the data });今度は、2 つの変数を持つリーダー内で読み取り関数を使用します
fetch("url") .then((response) => { // Note that there is a middle step before we receive the final data // Let's see what we actually receive console.log(response.body); return response.text(); }) .then((data) => { // Perform operations with the data });完全なコード例
interface ReadableStream// console.log(値) Uint8Array(551) [ 91、69、118、101、110、116、32、34、82、97、116、101、 100、32、98、108、105、116、122、32、103、97、109、101、 34、93、10、91、83、105、116、101、32、34、104、116、 116、112、115、58、47、47、108、105、99、104、101、115、 115、46、111、114、103、47、90、122、78、66、90、119、 100、71、34、93、10、91、68、97、116、101、32、34、 50、48、50、48、46、48、49、46、49、48、34、93、 10、91、87、104、105、116、101、32、34、86、101、101、 118、101、101、50、 ... 451 件以上のアイテム ] // console.log(new TextDecoder().decode(value)) [イベント「格付け電撃戦」] [サイト「https://lichess.org/ZzNBZwdG」] [日付「2020.01.10」] [ホワイト「Veevee222」] [ブラック「gg」] [結果「0-1」] [UTC日付「2020.01.10」] [UTC時間「20:21:02」] [ホワイトエロ「1858」] [ブラックエロ「1863」] [WhiteRatingDiff "-6"] [BlackRatingDiff「35」] [バリエーション「スタンダード」] [タイムコントロール「180 0」] [エコ「C00」] [終了「正常」]{ readonly locked: boolean; cancel(reason?: any): Promise ; getReader(options: { mode: "byob" }): ReadableStreamBYOBReader; getReader(): ReadableStreamDefaultReader ; getReader(options?: ReadableStreamGetReaderOptions): ReadableStreamReader ; pipeThrough ( transform: ReadableWritablePair , options?: StreamPipeOptions ): ReadableStream ; pipeTo( destination: WritableStream , options?: StreamPipeOptions ): Promise ; tee(): [ReadableStream , ReadableStream ]; }
interface ReadableStream1. e4 e6 2. d4 d6 3. c4 Nf6 4. Nc3 c5 5. f4 cxd4 6. Qxd4 Nc6 7. Qd1 b6 8. g3 Bb7 9. Bg2 Rc8 10. Nf3 Be7 11. O-O O-O 12. b3 Nb4 13. Bb2 a5 14.Re1 Qc7 15. a3 Na6 16. Rc1 Nc5 17. Qd4 Nxb3 18. Qd1 Nxc1 19. e5 0-1{ readonly locked: boolean; cancel(reason?: any): Promise ; getReader(options: { mode: "byob" }): ReadableStreamBYOBReader; getReader(): ReadableStreamDefaultReader ; getReader(options?: ReadableStreamGetReaderOptions): ReadableStreamReader ; pipeThrough ( transform: ReadableWritablePair , options?: StreamPipeOptions ): ReadableStream ; pipeTo( destination: WritableStream , options?: StreamPipeOptions ): Promise ; tee(): [ReadableStream , ReadableStream ]; }
fetch("url") .then((response) => { // Note that there is a middle step before we receive the final data // Let's see what we actually receive console.log(response.body); return response.text(); }) .then((data) => { // Perform operations with the data });たとえばリンク
たとえば、完全なコード go
これで、ネットワーク経由で送信されるゲームの PGN に段階的にアクセスできるようになります。たとえば、Web サイト UI でロードされたゲームを使用している場合、ユーザーはすべてのゲームがロードされるまで空白の画面やロード画面の前で待つ必要がありません。代わりに、データを段階的に表示できるため、UX の観点からははるかに優れています。
たとえば、完全なコードはここにあります
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3