← 中文资源

简体中文版本

从异步生成器创建可读流

从异步生成器创建 Node.js Readable 流,带背压和取消支持。

阅读英文原文

示例说明

从异步生成器创建 Node.js Readable 流,带背压和取消支持。本示例属于数据获取场景,提供可直接复制使用的javascript代码片段,附带边界条件与使用注意事项。

技术要点

  • Readable.from 把异步生成器转为流
  • push 返回 false 时暂停等待背压
  • takeWhile 按谓词取元素直到不满足

代码解读

上述代码实现了从异步生成器创建可读流的核心逻辑。从异步生成器创建 Node.js Readable 流,带背压和取消支持。代码中包含输入校验、核心算法和结果返回三个部分。关键在于正确处理边界情况,例如空输入、非法参数和并发场景。Readable.from 把异步生成器转为流,push 返回 false 时暂停等待背压。这些设计确保代码在生产环境中的健壮性。

使用建议

在实际项目中使用本示例时,建议先理解从异步生成器创建可读流的适用场景与限制条件。takeWhile 按谓词取元素直到不满足。根据具体业务需求调整参数配置,并编写单元测试覆盖正常路径与边界情况。本代码片段可直接集成到现有项目中,或作为参考实现自行扩展。

代码示例

import{Readable}from'node:stream';export function fromAsync(generator){return Readable.from(generator());}export function fromIterable(iterable,{objectMode=true}={}){return new Readable({objectMode,async read(){for await(const item of iterable){if(!this.push(item))return;}this.push(null);}});}export async function* range(start,end,step=1){for(let i=start;i<end;i+=step)yield i;}export async function* takeWhile(iterable,predicate){for await(const item of iterable){if(!predicate(item))return;yield item;}}