javascript - 如何在 JavaScript 中顺序组合两个同步迭代器?
问题描述
假设我们有两个异步迭代器,
const asyncIterable1 = {
[Symbol.asyncIterator]() {
return {
i: 0,
next() {
if (this.i < 3) {
return Promise.resolve({ value: this.i++, done: false });
}
return Promise.resolve({ done: true });
}
};
}
};
const asyncIterable2 = {
[Symbol.asyncIterator]() {
return {
i: 3,
next() {
if (this.i < 5) {
return Promise.resolve({ value: this.i++, done: false });
}
return Promise.resolve({ done: true });
}
};
}
};
现在,有没有办法将这两个迭代器组合成一个迭代器,它会返回一个 0,1,2 和 3,4 的序列?
解决方案
是的,我会用yield*
它:
const combine = (a, b) => (function* () { yield* a; yield* b; })();
const iterator = combine(
(function* () { yield 1; yield 2; })(),
(function* () { yield 3; yield 4; })()
);
console.log(iterator.next(), iterator.next(), iterator.next(), iterator.next(), iterator.next());
这类似于异步迭代器。但是,您将丢失第一个迭代器的返回值(“完成的产量”)。但是,您可以捕获它(值yield*
评估为)。
当然,如果您是喜欢重新发明轮子的人之一,您也可以在没有生成器功能的情况下“手动”实现此类功能:
function combine(...iterators) {
let pos = 0, iterator = iterators[pos];
return {
next() {
let result = { done: true };
do {
result = iterator.next();
if(!result.done) break;
iterator = iterators[ pos++ ];
} while(iterator)
return result;
}
};
}
const iterator = combine(
(function* () { yield 1; yield 2; })(),
(function* () { yield 3; yield 4; })()
);
console.log(iterator.next(), iterator.next(), iterator.next(), iterator.next(), iterator.next());
推荐阅读
- java - Alfresco 6.2 社区无法启动
- angular - 为什么我将 ng-template 放入手风琴选项卡中获得这种奇怪的渲染行为?
- python - 使用包含“:”的用户配置 sqlalchemy 引擎
- css - 如何在反应中在同一行显示项目?
- javascript - 如何将js中的jquery ajax函数发送到节点js文件
- docker - Snakemake --use-singularity 等待下载图片
- node.js - AWS SQS 和 SNS 中的消息结构
- python - 为什么我的自定义数据集在 self.transform 中失败 - 对象没有属性“transfrom”
- awk - Masscan 输出 我怎样才能只获取 ip:port 并保存到文件中?
- graphql - 将中型文章导入 gatsby