--- title: ReadableStream slug: Web/API/ReadableStream tags: - API - Fetch - ReadableStream - 引用 - 接口 translation_of: Web/API/ReadableStream --- <p>{{APIRef("Fetch")}}</p> <p><a href="https://developer.mozilla.org/zh-CN/docs/Web/API/Streams_API">流操作API</a> 中的<code>ReadableStream</code><span> 接口呈现了一个可读取的二进制流操作。</span><a href="https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API">Fetch API</a><span> 通过 {{domxref("Response")}} 的属性 {{domxref("Body.body", "body")}} 提供了一个具体的 </span><code>ReadableStream</code><span> 对象。</span></p> <h2 id="构造函数">构造函数</h2> <dl> <dt>{{domxref("ReadableStream.ReadableStream", "ReadableStream()")}}</dt> <dd>创建并从给定的 Handler 返回一个可读流对象。</dd> </dl> <h2 id="属性">属性</h2> <dl> <dt>{{domxref("ReadableStream.locked")}} {{readonlyInline}}</dt> <dd>locked 返回这个可读流是否被一个<a href="https://streams.spec.whatwg.org/#locked-to-a-reader" id="ref-for-locked-to-a-reader②">读取器锁定</a>。</dd> </dl> <h2 id="方法">方法</h2> <dl> <dt>{{domxref("ReadableStream.cancel()")}}</dt> <dd>取消读取流,读取方发出一个信号,表示对这束流失去兴趣。可以传入 reason 参数表示取消原因,这个原因将传回给调用方。</dd> <dt>{{domxref("ReadableStream.getIterator()")}}</dt> <dd>创建一个异步的 ReadableStream 迭代器并将流锁定于其上。一旦流被锁定,其他读取器将不能读取它,直到它被释放。</dd> <dt>{{domxref("ReadableStream.getReader()")}}</dt> <dd>创建一个读取器并将流锁定于其上。一旦流被锁定,其他读取器将不能读取它,直到它被释放。</dd> </dl> <dl> <dt>{{domxref("ReadableStream.pipeThrough()")}}</dt> <dd>提供将当前流管道输出到一个 transform 流或 writable/readable 流对的链式方法。</dd> </dl> <dl> <dt>{{domxref("ReadableStream.pipeTo()")}}</dt> <dd>将当前 ReadableStream 管道输出到给定的 {{domxref("WritableStream")}},并返回一个 promise,输出过程成功时返回 fulfilled,在发生错误时返回 rejected。</dd> <dt>{{domxref("ReadableStream.tee()")}}</dt> <dd><code>tee</code> 方法(tee本意是将高尔夫球放置在球座上)<a href="https://streams.spec.whatwg.org/#tee-a-readable-stream" id="ref-for-tee-a-readable-stream②">tees</a> 了可读流,返回包含两个{{domxref("ReadableStream")}} 实例分支的数组,每个元素接收了相同的传输数据。</dd> <dt>{{domxref("ReadableStream[@@asyncIterator]()")}}</dt> <dd><code>getIterator</code> 方法的别名。</dd> </dl> <h2 id="示例">示例</h2> <p>下面的例子,创建了一个智能的 {{domxref("Response")}} 来流式化从别的资源处取得的HTML 片段。</p> <p>它演示了 {{domxref("ReadableStream")}} 与 {{domxref("Uint8Array")}} 的协同用法。</p> <pre class="brush: js notranslate">fetch("https://www.example.org/").then((response) => { const reader = response.body.getReader(); const stream = new ReadableStream({ start(controller) { // 下面的函数处理每个数据块 function push() { // "done"是一个布尔型,"value"是一个Uint8Array reader.read().then(({ done, value }) => { // 判断是否还有可读的数据? if (done) { // 告诉浏览器已经结束数据发送 controller.close(); return; } // 取得数据并将它通过controller发送给浏览器 controller.enqueue(value); push(); }); }; push(); } }); return new Response(stream, { headers: { "Content-Type": "text/html" } }); });</pre> <h2 id="规范">规范</h2> <table class="standard-table"> <tbody> <tr> <th scope="col">Specification</th> <th scope="col">Status</th> <th scope="col">Comment</th> </tr> <tr> <td>{{SpecName('Streams','#rs-class','ReadableStream')}}</td> <td>{{Spec2('Streams')}}</td> <td>初始定义</td> </tr> </tbody> </table> <h2 id="浏览器兼容性">浏览器兼容性</h2> <p>{{Compat("api.ReadableStream")}}</p> <h2 id="相关链接">相关链接</h2> <ul> <li><a href="https://whatwg-stream-visualizer.glitch.me/">WHATWG Stream Visualiser</a>, for a basic visualisation of readable, writable, and transform streams.</li> </ul>