javascript - 如何包装 Node `EventEmitter` 以便能够将其作为终止的`AsyncIterator` 使用?
问题描述
我正在尝试使用 XML 流解析 API ( xml-flow
),它公开了一个节点,该节点为我感兴趣的标签EventEmitter
发出一堆事件,并在它完成读取文档时发出一个事件。tag
end
我希望能够使用Interactive Extensions来解决这个问题,但我不知道如何将其转换为结束的异步迭代;ix
只有fromEvent
/fromEventPattern
似乎没有办法处理“结束”事件。
尝试:
import * as aix from 'ix/asynciterable';
import flow from 'xml-flow';
const iterTags = aix.fromEvent(flow(...), 'tag:foo');
console.log('max', aix.max(iterTags));
不产生任何输出,而添加 a.pipe(tap(console.debug))
以打印正在迭代的值向我显示流实际上正在正确处理。
有没有办法可以连接end
事件以使迭代器return
正常工作?
解决方案
我设法通过使用 中的某些部分rxjs
而不是相应的ixjs
版本来创建一个异步迭代。
无论你用 rxjs 做什么,你都可以通过管道ix.from
将 observable 转换为异步迭代。
输入:
<root>
<foo>
<name>Bill</name>
<id>1</id>
<age>27</age>
</foo>
<foo>
<name>Sally</name>
<id>2</id>
<age>40</age>
</foo>
<foo>
<name>Kelly</name>
<id>3</id>
<age>37</age>
</foo>
</root>
代码:
const {fromEvent} = require('rxjs');
const {takeUntil, tap, map} = require('rxjs/operators');
const ai = require('ix/asynciterable');
const [aiFrom, aiMax] = [ai.from, ai.max];
const flow = require('xml-flow');
const fs = require('fs');
const path = require('path');
const inFile = fs.createReadStream(path.join(__dirname, 'test.xml'));
const eventEmitter = flow(inFile);
const iterTags = aiFrom(
fromEvent(eventEmitter, 'tag:foo')
.pipe(takeUntil(fromEvent(eventEmitter, 'end')))
.pipe(tap(console.log),
map(o=>o.age))
);
aiMax(iterTags).then((v)=>console.log("max age:", v));
// This works also
// (async()=>{
// for await(el of iterTags){
// console.log(el)
// }
// })();
输出:
{ '$name': 'foo', name: 'Bill', id: '1', age: '27' }
{ '$name': 'foo', name: 'Sally', id: '2', age: '40' }
{ '$name': 'foo', name: 'Kelly', id: '3', age: '37' }
max age: 40
推荐阅读
- html - CSS中的分层金字塔没有剪辑路径
- css - 全屏响应背景图片
- php - Laravel 谷歌地图检查矩形是否包含位置
- c# - 我正在尝试将值从控制器传递到查看页面,但它显示我的控制器正在接收空值,即使我在链接中传递它
- python - 如何让所有学生以多对多关系注册到特定课程列表中(1 和 2)
- libreoffice-calc - 计算 Libreoffice 计算公式的小时数
- reactjs - 尝试通过 react-redux 中的产品名称列表进行过滤
- c++ - 如何使用 std::error_condition?
- python - 如何在 python 中四舍五入 n 个组?
- regex - Apache ProxyPassMatch 匹配路径,包括顶级域