2

我看到使用 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', ... )

4

2 回答 2

0

我没有尝试过,但我能想到的最好的方法是使用 inputStream:

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

不过,我同意 Lars 的观​​点,即使这样可行,它也应该更容易找到并且更明确。可能想提交一个错误。

于 2012-08-25T17:13:02.550 回答
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
    };
  }
};
于 2012-08-20T20:55:15.527 回答