繁体   English   中英

在 es6 中,将带有回调的事件侦听器变成可迭代的

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

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

对于使用Wws程序,我的 websocket 模块,我希望它们通过iterable s“监听”。

例如,

// listen for new blog messages
let itr = ws.listen( 'blog', 'new' );

// display each new blog as we receive it
while( true ) {
  let blog = itr.next().value;
  dispBlog( blog );
}

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

你会如何在ws模块中编写generator

ws = function() {
  conn = new Websocket(...);

  // could have global `onmessage` that passes through the messages
  conn.onmessage = function(msg) {
    // can look at listeners and know there are iterators
    // but how to talk to them?
  }
  listeners = new Map();

  // generator for listening to incoming messages
  listener = function*( service, action ) {
    // can add this service.action to listeners, but what?
    // does this guy create his own `onmessage`?
    // if so, how does he get the `yield` to the outer function?
  }

如何将带有callbacklistener iterator转换为iterator

您可以通过以下示例类以一种hacky 方式完成此操作:

export class WebSocketMessageGenerator {
    private receivedMessages: Data[] = [];
    constructor(private readonly client: WebSocket) {}

    public async * messages() {
        this.client.on("message", (data: Data) => {
            this.receivedMessages.push(data);
        });

        while (true) {
            if (this.receivedMessages.length > 0) {
                yield this.receivedMessages.shift();
                continue;
            }
            await new Promise((resolve) => setTimeout(resolve, 10));
        }
    }
}

像这样调用:

const generator = new WebSocketMessageGenerator(new Websocket("url"));
const data = (await generator.messages().next()).value;

我不确定如何避免 while 循环中的睡眠,但您可以将其调整为合理的值。

暂无
暂无

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

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