在es6中,将带有回调的事件侦听器设置为可迭代的

in es6, make an event listener with a callback into an iterable

本文关键字:侦听器 事件 设置 迭代 回调 es6      更新时间:2023-09-26

我的websocket类Wws使用onmessage侦听所有传入消息。

对于使用Wws(我的websocket模块)的程序,我希望它们通过iterable s"监听"

例如

//收听新的博客消息let itr=ws-listen('blog','new');//在收到每个新博客时显示它while(true){let blog=itr.next().value;dispBlog(博客);}

任何数量的CCD_ 5可能挂在事件侦听器上。

您将如何在ws模块中编写generator

ws=函数(){conn=新的Websocket(…);//可以具有通过消息的全局"onmessage"conn.onmessage=函数(消息){//可以查看侦听器并知道存在迭代器//但是如何与他们交谈呢?}listeners=新映射();//用于侦听传入消息的生成器listener=函数*(服务,操作){//可以将此service.action添加到侦听器,但是什么?//这家伙创造了自己的"onmessage"吗?//如果是这样的话,他是如何得到外部函数的"屈服"的?}

如何将带有callbacklistener转换为iterator

您可以通过以下示例类实现这一点:

// A class that wraps a `WebSocket` to allow you to `await` on messages.
// Useful for blocking until a message is received, and continuing to listen
// afterward.
export class WebSocketMessageGenerator {
    private receivedMessages: Data[] = [];
    private wait: Promise<void>;
    private waitResolve?: () => void;
    private generator: AsyncGenerator<Data | undefined, void>;
    private closed = false;
    constructor(private readonly client: WebSocket) {
        this.generator = this.messages();
        this.wait = new Promise<void>((resolve) => {
            this.waitResolve = resolve;
        });
        this.client.on("message", (data: Data) => {
            this.receivedMessages.push(data);
            if(!this.waitResolve) {
                throw new Error("waitResolve is undefined");
            }
            this.waitResolve();
            this.wait = new Promise<void>((resolve) => {
                this.waitResolve = resolve;
            });
        });
        this.client.on("close", () => {
            this.closed = true;
        });
    }
    public async * messages() {
        while (!this.closed) {
            if (this.receivedMessages.length > 0) {
                yield this.receivedMessages.shift();
                continue;
            }
            await this.wait;
        }
    }
    public async nextMessage<T>(): Promise<T> {
        const message = await this.generator.next();
        if (message.done) {
            throw new Error("No more messages");
        }
        if (!message.value) {
            throw new Error("No message");
        }
        return JSON.parse(message.value.toString());
    }
}

这样打电话:

const generator = new WebSocketMessageGenerator(new Websocket("url"));
const data = await generator.nextMessage();