IxJS

IxJS

JavaScript同步异步集合操作库

IxJS为JavaScript提供同步和异步集合操作功能。该库支持可迭代对象、生成器和异步迭代器,统一了拉取式集合的处理方式。IxJS适用于I/O操作,允许按需获取数据。通过Iterable和AsyncIterable类,开发者可使用map、filter、reduce等熟悉方法高效处理各类集合。

IxJS异步迭代器JavaScript库集合操作迭代器模式Github开源项目

JavaScript 交互式扩展(IxJS)

构建状态 构建状态 npm 版本 加入 Gitter 聊天

IxJS 是一组库,用于在 JavaScript 中组合同步和异步集合,以及 Array#extras 风格的组合

JavaScript 交互式扩展(IxJS)将 Array#extras 组合器引入到可迭代对象、生成器、异步可迭代对象和异步生成器中。随着 ES2015 引入 Symbol.iterator 和生成器,以及后续引入 Symbol.asyncIterator 和异步生成器,我们显然需要一个抽象来处理这些数据结构的组合、查询等操作。

IxJS 统一了同步和异步的基于拉取的集合,就像 RxJS 统一了基于推送的集合世界一样。RxJS 非常适合事件驱动的工作流,其中数据可以按生产者的速率推送,而 IxJS 则非常适合 I/O 操作,您作为消费者可以在准备好时拉取数据。

从 npm 安装 IxJS

npm install ix

(另请阅读我们如何打包 IxJS

Iterable

Iterable 类提供了一种创建和组合同步集合的方式,类似于 JavaScript 中的数组、映射和集合,使用您熟悉的 Array#extras 风格方法,如 mapfilterreduce 等。我们可以使用 for ... of 语句来遍历我们的集合。

// ES import { from } from 'ix/iterable'; import { filter, map } from 'ix/iterable/operators'; // CommonJS const from = require('ix/iterable').from; const { filter, map } = require('ix/iterable/operators'); const source = function* () { yield 1; yield 2; yield 3; yield 4; }; const results = from(source()).pipe( filter(x => x % 2 === 0), map(x => x * x) ); for (let item of results) { console.log(`Next: ${item}`); } // Next 4 // Next 16

此外,我们还提供了 forEach 方法,由您选择使用哪一个。

// ES import { from } from 'ix/asynciterable'; import { filter, map } from 'ix/asynciterable/operators'; // CommonJS const from = require('ix/asynciterable').from; const { filter, map } = require('ix/asynciterable/operators'); const source = function* () { yield 1; yield 2; yield 3; yield 4; }; const results = from(source()).pipe( filter(x => x % 2 === 0), map(x => x * x) ); results .forEach(item => { console.log(`Next: ${item}`); }); // Next 4 // Next 16

为了打包考虑,我们可以不引入整个 Iterable 库,而是选择我们需要的运算符,直接添加到 Iterable 原型上。

// ES import { IterableX as Iterable } from 'ix/iterable'; import 'ix/add/iterable/of'; import 'ix/add/iterable-operators/map'; // CommonJS const { IterableX: Iterable } = require('ix/iterable'); require('ix/add/iterable/of'); require('ix/add/iterable-operators/map'); const results = Iterable.of(1,2,3) .map(x => x + '!!');

Iterable 对象通过暴露 [Symbol.iterator] 方法来实现 JavaScript 中的迭代器模式,该方法返回 Iterator 类。迭代器通过调用 next() 方法来产生值,该方法返回 IteratorResult 类。

interface Iterable<T> { [Symbol.iterator](): Iterator<T>; } interface Iterator<T> { next(value?: any): IteratorResult<T>; return?(value?: any): IteratorResult<T>; throw?(e?: any): IteratorResult<T>; } interface IteratorResult<T> { value: T; done: Boolean; }

AsyncIterable

AsyncIterable 对象基于 ECMAScript 提案中的异步迭代器。这允许我们创建 Promise 的异步集合,并能够使用我们可以导入的 mapfilterreduce 等方法。与 Iterable 对象类似,我们可以使用 for await ... of 来遍历异步集合。

// ES import { from } from 'ix/asynciterable'; import { filter, map } from 'ix/asynciterable/operators'; // CommonJS const from = require('ix/asynciterable').from; const { filter, map } = require('ix/asynciterable/operators'); const source = async function* () { yield 1; yield 2; yield 3; yield 4; }; const results = from(source()).pipe( filter(async x => x % 2 === 0), map(async x => x * x) ); for await (let item of results) { console.log(`Next: ${item}`); } // Next 4 // Next 16

另外,我们可以使用内置的 forEach 方法,如果有任何错误,可以使用 catch 捕获:

// ES import { from } from 'ix/asynciterable'; import { filter, map } from 'ix/asynciterable/operators'; // CommonJS const from = require('ix/asynciterable').from; const { filter, map } = require('ix/asynciterable/operators'); const source = async function* () { yield 1; yield 2; yield 3; yield 4; }; const results = from(source()).pipe( filter(async x => x % 2 === 0), map(async x => x * x) ); results .forEach(item => { console.log(`Next: ${item}`); }) .catch(err => { console.log(`Error ${err}`); }); for await (let item of results) { console.log(`Next: ${item}`); } // Next 4 // Next 16

为了打包考虑,我们可以不引入整个 AsyncIterable 库,而是选择我们需要的运算符,直接添加到 AsyncIterable 原型上。

// ES import { AsyncIterableX as AsyncIterable } from 'ix/asynciterable'; import 'ix/add/async-iterable/of'; import 'ix/add/asynciterable-operators/map'; // CommonJS const { AsyncIterableX: AsyncIterable } = require('ix/asynciterable'); require('ix/add/asynciterable-operators/map'); const results = AsyncIterable.of(1,2,3) .map(x => x + '!!');

AsyncIterable 类通过暴露 [Symbol.asyncIterator] 方法来实现 JavaScript 中的异步迭代器模式,该方法进而暴露 AsyncIterator 类。迭代器通过调用 next() 方法产生值,该方法返回一个 Promise,解析为 IteratorResult 类。

interface AsyncIterable<T> { [Symbol.asyncIterator](): AsyncIterator<T>; } interface AsyncIterator<T> { [Symbol.asyncIterator](): AsyncIterator<T>; next(value?: any): Promise<IteratorResult<T>>; return?(value?: any): Promise<IteratorResult<T>>; throw?(e?: any): Promise<IteratorResult<T>>; } interface IteratorResult<T> { value: T; done: Boolean; }

从 Iterable 转换为 AsyncIterable

使用 IxJS,你可以通过多种方法轻松地将 Iterable 转换为 AsyncIterable。首先,我们可以使用 from 函数,既可以作为独立函数使用,也可以在 Ix.AsyncIterable 对象上使用。from 方法接受标准的 IterableGenerator 和 Promise 的 Iterator,甚至是另一个 AsyncIterable

import { from } from 'ix/asynciterable'; import { map } from 'ix/asynciterable/operators'; const xs = [1, 2, 3, 4]; const mapped = from(xs).pipe( map(async (item, index) => item * index) ); for await (let item of mapped) { console.log(`Next: ${item}`); } // Next 0 // Next 2 // Next 6 // Next 12

贡献

我们感谢对 IxJS 项目的贡献。IxJS 项目的发展得益于像您这样的社区参与。请阅读以下内容,了解如何参与。

行为准则

IxJS 项目有一个严格的行为准则,必须始终遵守。这个行为准则来自贡献者公约。请阅读完整文本,了解哪些行为是允许的,哪些是不允许的。

贡献指南

阅读贡献指南,了解如何参与 IxJS 项目。这包括我们的开发流程以及如何在提交代码之前进行测试。

打包

IxJS 用 TypeScript 编写,但项目被编译为多个 JS 版本和常见的模块格式。为了方便起见,基本的 IxJS 包包含了所有的编译目标,但如果你对 node_modules 的体积很敏感,别担心 —— 我们也考虑到了这一点。这些目标也以 @reactivex 命名空间发布:

npm install @reactivex/ix-ts # TypeScript 目标 npm install @reactivex/ix-es5-cjs # ES5 CommonJS 目标 npm install @reactivex/ix-es5-esm # ES5 ESModules 目标 npm install @reactivex/ix-es5-umd # ES5 UMD 目标 npm install @reactivex/ix-es2015-cjs # ES2015 CommonJS 目标 npm install @reactivex/ix-es2015-esm # ES2015 ESModules 目标 npm install @reactivex/ix-es2015-umd # ES2015 UMD 目标 npm install @reactivex/ix-esnext-cjs # ESNext CommonJS 目标 npm install @reactivex/ix-esnext-esm # ESNext ESModules 目标 npm install @reactivex/ix-esnext-umd # ESNext UMD 目标

我们为什么这样打包

JS 社区是一个多样化的群体,有各种各样的目标环境和工具链。发布多个包可以满足各种类型的项目需求。针对最新 JS 运行时的朋友可以使用 ESNext + ESM 构建。需要广泛浏览器支持和小下载体积的朋友可以使用 UMD 包,它已经通过 Google 的 Closure Compiler 进行了高级优化。

如果你认为我们遗漏了某个编译目标,而这阻碍了你的采用,请开一个 issue。我们随时为你服务 ❤️。

许可证

MIT 许可证 (MIT)

版权所有 (c) ReactiveX

特此免费授予任何获得本软件及相关文档文件("软件")副本的人不受限制地处理本软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,以及允许向其提供软件的人这样做,但须符合以下条件:

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按"原样"提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,还是产生于、源于或有关于本软件以及本软件的使用或其它处置。

编辑推荐精选

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

下拉加载更多