繁体   English   中英

在 asyncIterator 生成器 function 中等待异步操作

[英]Wait for an async operation inside asyncIterator generator function

我有这个Queue class (不是真正的实现,但它体现了我的观点):

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生成器 function 中的有效操作。

我考虑过在上一次迭代中设置一个标志:

*[Symbol.asyncIterator]() {
    let continue = true;
    do {
        yield this.pop().then(v => {
            if (!v) continue = false;
            return v
        });
    } while (continue);
}

但这仍然会在pop()的最后一次执行中返回一个undefined的值。

我可以在调用代码中通过检查undefined的值作为迭代结束的信号来处理这个问题,但我想知道是否有更好的方法来解决这个问题。

您可以使用async生成器 function (缺少 MDN 文档,但请参阅例如 这篇文章)来实现[Symbol.asyncIterator]()方法

async *[Symbol.asyncIterator]() { /*
^^^^^ */
    while (this._arr.length) {
        yield await this.pop(); // no longer a problem
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM