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
    }
}