在Http请求中关闭监听器或监听器

时间:2012-08-20 19:45:05

标签: dart

我看到nodejs可以在请求中添加一个监听器:

req.addListener('close', .... );

但是我找不到如何处理Dart。 我需要取消使用SourceEvent发送数据的计时器。如果不取消它,它会在客户端断开连接时继续运行。

编辑:我添加我的用例

_time(HttpRequest request, HttpResponse response) {
  response.headers..set(HttpHeaders.CONTENT_TYPE, 'text/event-stream')
              ..set(HttpHeaders.CACHE_CONTROL, 'no-cache')
              ..set(HttpHeaders.CONNECTION, 'keep-alive');
  var timer = new Timer.repeating(1000, (_){
    Date now = new Date.now();
    response.outputStream..writeString('data:${now.millisecondsSinceEpoch}\n\n');
  });
  // Here what I want to do
  request.onClose((event) => timer.cancel();  
}

我的请求是我的请求处理程序在url“/ time”上的经典http请求调用。我使用SourceEvent将时间推到客户端,它工作正常。 但是当客户关闭他的联系时我需要检测。搜索之后,如何做到这一点,发现许多带有nodejs的样本使用了这个req.addListener('close', ... )

2 个答案:

答案 0 :(得分:0)

您可以向HttpClientConnection和响应/请求数据流添加事件处理程序。像这样:

var conn = httpClient.get(host, port, path);
conn.onResponse = (HttpClientResponse response) {
  if(response.statusCode == 200) {
    StringInputStream stream = new StringInputStream(response.inputStream);
    StringBuffer body = new StringBuffer();
    stream.onData = () => body.add(stream.read());
    stream.onClosed = () {
      // do something when its closed
    };
  }
};

答案 1 :(得分:0)

我没试过这个,但我能想到的最好的就是使用inputStream:

request.inputStread.onClosed((_) => timer.cancel());

我同意Lars的观点,即使它有效也应该更容易找到并更明确。可能想要提交错误。