Javascript 如何包装节点'EventEmitter',使其能够作为终止的'AsyncIterator'使用?

Javascript 如何包装节点'EventEmitter',使其能够作为终止的'AsyncIterator'使用?,javascript,node.js,async-await,generator,ixjs,Javascript,Node.js,Async Await,Generator,Ixjs,我正在尝试使用一个XML流解析API(),它公开一个节点EventEmitter,该节点为我感兴趣的标记发出一系列tag事件,并在完成读取文档时发出一个end事件 我希望能够使用它,但我不知道如何将其转换为一个异步iterable来结束ix只有fromEvent/fromEventPattern似乎没有处理“结束”事件的方法 正在尝试: import * as aix from 'ix/asynciterable'; import flow from 'xml-flow'; const ite

我正在尝试使用一个XML流解析API(),它公开一个节点
EventEmitter
,该节点为我感兴趣的标记发出一系列
tag
事件,并在完成读取文档时发出一个
end
事件

我希望能够使用它,但我不知道如何将其转换为一个异步iterable来结束
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));
在添加
.pipe(点击(console.debug))
以打印正在迭代的值时,不产生任何输出,这表明流实际上正在正确处理


是否有一种方法可以连接
end
事件,使迭代器
返回
,从而正确工作

通过使用
rxjs
中的一些部分,而不是相应的
ixjs
版本,我成功地创建了一个异步iterable

无论您对rxjs做什么,您都可以通过管道从
ix.from
将可观测数据转换为异步可观测数据

输入:


比尔
1.
27
俏皮话
2.
40
凯莉
3.
37
代码:

const{fromEvent}=require('rxjs');
const{takeUntil,tap,map}=require('rxjs/operators');
const ai=require('ix/asynciterable');
常量[aiFrom,aiMax]=[ai.from,ai.max];
const flow=require('xml-flow');
常数fs=要求('fs');
const path=require('path');
const infle=fs.createReadStream(path.join(uu dirname,'test.xml');
常量事件发射器=流量(填充);
const iterTags=aiFrom(
fromEvent(eventEmitter,'tag:foo')
.pipe(takeUntil(fromEvent(eventEmitter,'end'))
.管道(水龙头(控制台日志),
映射(o=>o.age))
);
然后((v)=>console.log(“max age:,v));
//这也行得通
//(异步()=>{
//等待(iterTags的el){
//控制台日志(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

也许把它包装成一条可读的溪流,哦,迂回但很好