aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/api/readablestream/index.html
blob: 445fc134d1f09ad2eff00778b9bef0a0ffd6de45 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
---
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) =&gt; {
  const reader = response.body.getReader();
  const stream = new ReadableStream({
    start(controller) {
      // 下面的函数处理每个数据块
      function push() {
        // "done"是一个布尔型,"value"是一个Unit8Array
        reader.read().then(({ done, value }) =&gt; {
          // 判断是否还有可读的数据?
          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>