【问题标题】:How to detect opening of a websocket connection from a controller如何从控制器检测 websocket 连接的打开
【发布时间】:2014-04-21 13:44:45
【问题描述】:

我有一个控制器 (MyController),它在初始化时从 websocket 连接 (wsService) 请求数据。

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

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

my_controller.dart:

MyController(wsService ws){
  // when refresh() in wsService is called, 
  // the call is redirected to MyController's load()
  ws.refresh = load; 
}

load(){
  ws.send(request);
}

ws_service.dart:

onConnect(){ //this is called when websocket connection is opened
  refresh(); //this calls MyController's load()
}

【问题讨论】:

  • stackoverflow.com/questions/22417566 包含一个很好的例子(参见 web\main.dart)。您需要对 Futures 使用异步编程。 webSocket.onOpen.onOpen.first.then((x) => onConnect());
  • 我刚刚看到这个例子来自你。那我不明白你的问题。
  • 我的问题是,当 MyController 初始化时,websocket 连接还没有打开。在我的问题中,我已经为该问题提供了解决方案(在连接打开后调用 load()),但我不确定这是不是最好的方法。
  • 我还没有尝试过,但你可以检查 ws.readyState 并且当它尚未打开时,你可以像在你的示例中那样监听“打开”。 developer.mozilla.org/en-US/docs/Web/API/…
  • @GünterZöchbauer 谢谢。我删除了 ws.refresh = load; 并更新了 MyController 的构造函数:_scope.$watch(() => ws.webSocket.readyState, (state) => (state == WebSocket.OPEN) ? load() : null); 现在更容易理解正在发生的事情,而且 wsService 也不再受到污染。我认为你应该用这个解决方案“回答”。

标签: dart angular-dart


【解决方案1】:

我仍然认为你应该做这样的事情而不是让 Angular 轮询状态。

MyController(wsService ws){
  if(ws.readyState == WebSocket.OPEN) {
    load();
  } else {
    ws.onOpen.first.then((_) => load());
  }
}

load(){
  ws.send(request);
}

【讨论】:

  • 你说得对,轮询效率不高。但我宁愿在一个地方处理 websocket 连接(打开、关闭等),因此我会使用 Timer.periodic 来测试状态,当状态为“打开”时,调用 load() 并取消计时器。我试图在此处包含示例代码,但不能。
  • 但这也是轮询。您认为我的示例不适用于什么?
  • 您可以创建自己的答案并在此处发布代码以供讨论。
  • 如果控制器中的ws.onOpen.first.then((_) => load());先运行,则wsService中的回调函数不会注册。换句话说:如果连接是打开的,那么ws.onOpen.first.then((_) => ...); 不会做任何事情。
  • 抱歉有一个错误,我在if( 之后删除了!。我认为它应该这样工作。
【解决方案2】:

此解决方案仍在使用轮询,但通过此解决方案,websocket 连接的处理保留在一个地方 (wsService),并且函数调用中没有重复。

MyController(wsService ws){
  new Timer.periodic(new Duration(milliseconds: 100), (t){
    if(ws.webSocket.readyState == WebSocket.OPEN) {
      t.cancel();
      load();
    }
  });
}

load(){
  ws.send(request);
}

【讨论】:

    猜你喜欢
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 2014-03-04
    • 2013-12-28
    • 1970-01-01
    相关资源
    最近更新 更多