在es6中,将带有回调的事件侦听器设置为可迭代的
in es6, make an event listener with a callback into an iterable
我的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"吗?//如果是这样的话,他是如何得到外部函数的"屈服"的?}
如何将带有callback
的listener
转换为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();
相关文章:
- 如何在for循环中添加事件侦听器
- 未命中服务器发送的事件侦听器
- 如何覆盖原型中的事件侦听器
- 无法将事件侦听器附加到画布
- 如何在d3.js中自定义事件侦听器
- 在es6中,将带有回调的事件侦听器设置为可迭代的
- 事件侦听器未在chrome扩展中的options.js中启动
- IE8更改文本区域上的事件侦听器不工作
- 将事件侦听器添加到文档,而不是签入元素存在,然后添加事件侦听器
- javascript删除事件侦听器
- 我应该/如何清除mousemove JQuery事件侦听器
- 在JQuery中使用谷歌地图Api事件/侦听器
- 如何使用我的Jquery代码创建委托事件侦听器
- 'mousemove'画布中的事件侦听器-指针仅在最后一个矩形中更改
- 为什么此事件侦听器不工作
- 仅当类存在于Javascript中时才允许侦听器事件运行
- 不确定Google Maps的侦听器事件中值为何未定义
- 如何向控件添加侦听器事件
- 无法在地图单击侦听器事件上显示另一个地图
- Chrome运行时OnMessage侦听器事件未启动