Javascript 在asyncIterator生成器函数中等待异步操作
我有一个Javascript 在asyncIterator生成器函数中等待异步操作,javascript,ecmascript-2018,Javascript,Ecmascript 2018,我有一个Queue类(不是真正的实现,但它举例说明了我的观点): 它只是Javascript数组的包装器,只是它的方法返回一个承诺 我想做的是根据pop()方法的返回值有条件地产生结果,我不能这样做,因为await在异步迭代器生成器函数中不是有效的操作 我考虑在上一次迭代中设置一个标志: *[Symbol.asyncIterator]() { let continue = true; do { yield this.pop().then(v => {
Queue
类(不是真正的实现,但它举例说明了我的观点):
它只是Javascript数组
的包装器,只是它的方法返回一个承诺
我想做的是根据pop()
方法的返回值有条件地产生结果,我不能这样做,因为await
在异步迭代器
生成器函数中不是有效的操作
我考虑在上一次迭代中设置一个标志:
*[Symbol.asyncIterator]() {
let continue = true;
do {
yield this.pop().then(v => {
if (!v) continue = false;
return v
});
} while (continue);
}
但在上次执行pop()
时,仍会返回一个未定义的值
我可以在调用代码中通过检查未定义的值作为迭代结束的信号来处理此问题,但我想知道是否有更好的方法来解决此问题。您可以使用(MDN docs missing,但请参见示例)来实现:
对于一个真正的队列实现,可以看一下。它还适当地实现了[Symbol.asyncierator]()
,没有任何生成器函数。啊,简单。我知道某处有这样的东西。谢谢
*[Symbol.asyncIterator]() {
let continue = true;
do {
yield this.pop().then(v => {
if (!v) continue = false;
return v
});
} while (continue);
}
async *[Symbol.asyncIterator]() { /*
^^^^^ */
while (this._arr.length) {
yield await this.pop(); // no longer a problem
}
}