javascript - 等待 asyncIterator 生成器函数中的异步操作
问题描述
我有这个Queue
类(不是真正的实现,但它体现了我的观点):
class Queue {
constructor() {
this._arr = [];
}
async push(elem) {
this._arr.push(elem);
}
async pop() {
return this._arr.pop();
}
*[Symbol.asyncIterator]() {
do {
let res = await this.pop(); // here is the problem
if (res) yield res;
} while (res);
}
}
它只是 Javascript 的包装器,只是Array
它的方法返回一个Promise
.
我想要做的是根据pop()
方法的返回值有条件地产生,我不能这样做,因为它不是生成器函数await
内部的有效操作。asyncIterator
我考虑过在上一次迭代中设置一个标志:
*[Symbol.asyncIterator]() {
let continue = true;
do {
yield this.pop().then(v => {
if (!v) continue = false;
return v
});
} while (continue);
}
但这仍然会undefined
在最后一次执行时返回一个值pop()
。
我可以在调用代码中通过检查一个undefined
值作为迭代结束的信号来处理这个问题,但我想知道是否有更好的方法来解决这个问题。
解决方案
您可以使用async
生成器函数(缺少 MDN 文档,但请参见例如这篇文章)来实现该[Symbol.asyncIterator]()
方法:
async *[Symbol.asyncIterator]() { /*
^^^^^ */
while (this._arr.length) {
yield await this.pop(); // no longer a problem
}
}
推荐阅读
- azure-data-factory - 如何在 Azure 数据工厂中参数化数据集定义文件名
- python - 如何从 CSV 的 HTML 页面中删除换行符 (\n)?
- python - ChromeDriver Chrome 版本错误和安装问题
- sql - 为什么我必须添加括号才能使工会工作
- google-cloud-platform - Google Cloud Function 限制开发者/编辑者对函数的访问
- python - 特定列的平均值并将它们存储在新列中
- python - 使用 Dropbox 时 Django 存储后端 url 模式错误
- python - 再次打印变量的结果,即使它已被更改
- javascript - 我如何实现要求用户在购买前先选择项目的 java 脚本验证?
- python-3.x - 如何在 4D Nifti MRI 图像上正确循环和绘图