[英]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? }
如何将带有callback
的listener
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.