Dart 如何从控制器检测websocket连接的打开
我有一个控制器(MyController),它在初始化时从websocket连接(wsService)请求数据 检测并等待websocket连接打开,然后从控制器发出请求的最佳方法是什么 现在我使用以下解决方案: my_controller.dart:Dart 如何从控制器检测websocket连接的打开,dart,angular-dart,Dart,Angular Dart,我有一个控制器(MyController),它在初始化时从websocket连接(wsService)请求数据 检测并等待websocket连接打开,然后从控制器发出请求的最佳方法是什么 现在我使用以下解决方案: my_controller.dart: MyController(wsService-ws){ //调用wsService中的refresh()时, //调用被重定向到MyController的加载() ws.refresh=load; } 加载(){ 发送(请求); } ws_se
MyController(wsService-ws){
//调用wsService中的refresh()时,
//调用被重定向到MyController的加载()
ws.refresh=load;
}
加载(){
发送(请求);
}
ws_service.dart:
onConnect(){//打开websocket连接时调用此函数
refresh();//这将调用MyController的load()
}
我仍然认为你应该做这样的事情,而不是让它成为一个州
MyController(wsService-ws){
if(ws.readyState==WebSocket.OPEN){
加载();
}否则{
ws.onOpen.first.then(()=>load());
}
}
加载(){
发送(请求);
}
此解决方案仍然使用轮询,但使用此解决方案,websocket连接的处理保持在一个位置(wsService
),并且函数调用中没有重复项
MyController(wsService-ws){
新定时器。周期性(新持续时间(毫秒:100),(t){
if(ws.webSocket.readyState==webSocket.OPEN){
t、 取消();
加载();
}
});
}
加载(){
发送(请求);
}
包含一个很好的示例(请参见web\main.dart)。您需要对未来使用异步编程webSocket.onOpen.onOpen.first.then((x)=>onConnect())代码>我刚才看到这个例子是你写的。我不明白你的问题。我的问题是,当MyController初始化时,websocket连接尚未打开。在我的问题中,我给出了该问题的解决方案(在连接打开后调用load()),但我不确定这是否是最好的方法。我还没有尝试过,但您可以检查ws.readyState,当它尚未打开时,您可以像示例中那样侦听“open”@GünterZöchbauer谢谢你。我删除了ws.refresh=load代码>并更新了MyController的构造函数:\u scope.$watch(()=>ws.webSocket.readyState,(state)=>(state==webSocket.OPEN)?load():null代码>现在更容易理解正在发生的事情,而且wsService不再受到污染。我认为你应该用这个解决方案“回答”。你是对的,投票效率不高。但是我宁愿在一个地方处理websocket连接(打开、关闭等),因此我会使用计时器。定期测试状态,当状态为“打开”时,调用加载()
并取消计时器。我试图在这里包含示例代码,但无法。但这也是轮询。您认为我的示例中有什么不适用?您可以创建自己的答案,并将代码发布到那里以供讨论。如果ws.onOpen.first.then(()=>load())首先运行控制器中的code>,然后wsService中的回调函数将不会注册。换句话说:如果连接是打开的,那么ws.onOpen.first.then(())=>…)代码>不会做任何事情。很抱歉出现了错误,我删除了在if(
)后面加上code>。我认为应该这样做。