AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
# 流 Workers脚本在交付给之前无需准备完整的响应主体`event.respondWith()`。发送最重要的内容(即HTTP状态行和标头)*后,*您可以`TransformStream`用来流式传输响应正文。这可以使您最小化: * 访客到第一字节的时间。 * 在Workers脚本中完成的缓冲。 对于处理或转换大于Workers脚本内存限制的响应主体,最小化缓冲尤其重要。对于这些情况,流是唯一的实现策略。 默认情况下,Cloudflare Workers服务流。仅使用这些API来*修改*响应主体,同时保持流式传输行为。如果您的Workers脚本仅将子请求响应逐字传递回客户端而不读取其主体文本,则其主体处理已经是最佳选择,您不必使用这些API。 \**注意:Streams API仅[在Request Context](https://developers.cloudflare.com/workers/about/tips/request-context)内部可用。* ### 流过 开发人员用于执行活动流的两个原语are`TransformStream`和[`ReadableStream.pipeTo()`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/pipeTo)方法。 **基本的最小直通用法示例:** ~~~javascript addEventListener('fetch', event => { event.respondWith(fetchAndStream(event.request)) }) async function fetchAndStream(request) { // Fetch from origin server. let response = await fetch(request) // Create an identity TransformStream (a.k.a. a pipe). // The readable side will become our new response body. let { readable, writable } = new TransformStream() // Start pumping the body. NOTE: No await! response.body.pipeTo(writable) // ... and deliver our Response while that's running. return new Response(readable, response) } ~~~ 请注意,我们所说的`response.body.pipeTo(writable)`,但这样做*没有*`await`它。这样一来,它就不会阻止该`fetchAndStream()`功能其余部分的前进。它继续异步运行,直到响应完成或客户端断开连接。 `response.body.pipeTo(writable)`响应返回给客户端后,运行时可以继续运行函数()。这个例子只是将子请求响应主体泵送到最终响应主体。但是,您可以使用更复杂的逻辑,例如在正文中添加前缀或后缀或以某种方式对其进行处理。 ## 参考 ### 转换流 #### 物产 * `readable`:的实例`ReadableStream`。 * `writable`:的实例`WritableStream`。 ### ReadableStream **注意:**A`ReadableStream`将作为中的`readable`属性返回`TransformStream`。在Workers平台上,`ReadableStream`不能直接使用`ReadableStream`构造函数创建。 #### Properties 属性 * `locked`:一个布尔值,指示可读流是否已锁定到阅读器。 #### 方法 * `pipeTo(destination)`:将可读流通过管道传输到给定的可写流,`destination`并返回在`write`操作成功时实现的承诺,或者在操作失败时拒绝它。 * `getReader`:获取的实例`ReadableStreamDefaultReader`并将其锁定`ReadableStream`到该阅读器实例。此方法接受指示*options*的对象参数。我们仅支持一个`mode`,可以将其设置`byob`为创建一个`ReadableStreamBYOBReader`,如以下代码段所示: ~~~javascript let reader = readable.getReader({ mode: 'byob' }) ~~~ ### ReadableStreamDefaultReader #### Properties 属性 * `closed`:表示阅读器是否关闭的承诺。当阅读器流关闭时,将实现诺言;如果流中有错误,则诺言将被拒绝。 #### 方法 * `read`:一个保证,将返回通过阅读器队列传递的下一个可用数据块。 * `cancel(reason)`:取消流,并传递一个可选的`reason`字符串(意图是人类可读的)以指示取消的原因。**注意:**所有尚未读取的数据都会丢失。 * `releaseLock`:释放对可读流的锁定。如果读取器有待处理的读取操作,则无法释放锁定。`TypeError`引发A,并且阅读器保持锁定状态。 ### ReadableStreamBYOBReader **注意:**`ReadableStreamBYOBReader`通过将`byob`模式传递给的实例创建`getReader`的实例`ReadableStream`,在功能上`ReadableStreamDefaultReader`与`read`方法相同,但方法相同。 #### 方法 * `read(buffer)`:返回一个承诺,并将下一个可用的数据块读入传入的缓冲区。 ### 可写流 **注意:**A`WritableStream`将作为中的`writable`属性返回`TransformStream`。在Workers平台上,`WritableStream`不能使用`WritableStream`构造函数直接创建。 #### Properties 属性 * `locked`:一个布尔值,指示可写流是否已锁定到编写器。 #### 方法 * `abort(reason)`:中止流,并传递一个可选的`reason`字符串(意图是人类可读的)以指示取消的原因。此方法返回一个带有响应的Promise`undefined`。**注意:**所有尚未写入的数据都会丢失。 * `getWriter`:获取的实例`WritableStreamDefaultWriter`并将其锁定`WritableStream`到该作家实例。 ### WritableStreamDefaultWriter #### Properties 属性 * `desiredSize`:以整数形式返回填充流内部队列所需的大小。始终返回1、0(如果流已关闭)或`null`(如果流有错误)。 * `closed`:一个承诺,指示编写器是否已关闭。当writer流关闭时,promise将兑现;如果流中有错误,则拒绝。 #### 方法 * `abort(reason)`:如果编写器处于活动状态,则中止它类似于中使用的`abort`方法`WritableStream`。`reason`可以传递一个可选的字符串(意图是人类可读的)以指示取消的原因。此方法返回一个满足的承诺`undefined`。**注意:**所有尚未写入的数据都会丢失。 * `close`:尝试关闭编写器。剩余的写入将在关闭写入器之前完成处理。`undefined`如果编写器成功关闭并处理了剩余的写操作,或者由于任何错误而被拒绝,则此方法返回一个诺言。 * `releaseLock`:释放作者在流上的锁定。一旦发布,编写器将不再处于活动状态。您可以*在*`write(chunk)`解决所有挂起的调用*之前*调用此方法。这使您可以将`write`操作排队,释放锁,然后开始从另一个源管道传递到可写流,如以下示例所示: ~~~javascript let writer = writable.getWriter() // Write a preamble. writer.write(new TextEncoder().encode('foo bar')) // While that's still writing, pipe the rest of the body from somewhere else. writer.releaseLock() await someResponse.body.pipeTo(writable) ~~~ * `write(chunk)`:将大量数据写入编写器,并返回一个承诺,以指示操作成功还是失败。