我设法通过使用 中的某些部分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