Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 如何从控制器检测websocket连接的打开_Dart_Angular Dart - Fatal编程技术网

Dart 如何从控制器检测websocket连接的打开

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),它在初始化时从websocket连接(wsService)请求数据

检测并等待websocket连接打开,然后从控制器发出请求的最佳方法是什么

现在我使用以下解决方案:

my_controller.dart:

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()),然后wsService中的回调函数将不会注册。换句话说:如果连接是打开的,那么
ws.onOpen.first.then(())=>…)不会做任何事情。很抱歉出现了错误,我删除了
if(
)后面加上code>。我认为应该这样做。