【发布时间】:2021-08-08 17:17:54
【问题描述】:
我目前正在为要控制连接超时值的 Web 构建 Stomp WebSocket 连接。这是我的连接方法:
Future<WebSocketChannel> connect(StompConfig config) {
final completer = Completer<HtmlWebSocketChannel>();
final webSocket = WebSocket(config.url)..binaryType = BinaryType.list.value;
var onOpenEvent = webSocket.onOpen.first;
if (config.connectionTimeout.inMilliseconds > 0) {
onOpenEvent = onOpenEvent.timeout(config.connectionTimeout);
}
onOpenEvent.then((value) {
completer.complete(HtmlWebSocketChannel(webSocket));
});
webSocket.onError.first.then((err) {
completer.completeError(WebSocketChannelException.from(err));
});
return completer.future;
}
我就是这样称呼它的:
try {
_channel = await platform.connect(config);
} catch (err) {
print('Caught error');
}
遗憾的是,我似乎无法捕捉到onOpenEvent.timeout(..) 抛出的TimeoutException。相反,它只是打印这个(看似未捕获的异常):
Error: TimeoutException after 0:00:05.000000: Future not completed
at Object.createErrorWithStack (http://localhost:59275/dart_sdk.js:5044:12)
at Object._rethrow (http://localhost:59275/dart_sdk.js:37476:16)
at async._AsyncCallbackEntry.new.callback (http://localhost:59275/dart_sdk.js:37472:13)
at Object._microtaskLoop (http://localhost:59275/dart_sdk.js:37332:13)
at _startMicrotaskLoop (http://localhost:59275/dart_sdk.js:37338:13)
at http://localhost:59275/dart_sdk.js:33109:9
我做错了什么?我之前的代码看起来像这样并且适用于TimeoutException,但遗憾的是不适用于 WebSocket 引发的任何其他异常:
Future<WebSocketChannel> connect(StompConfig config) async {
final webSocket = WebSocket(config.url)..binaryType = BinaryType.list.value;
var onOpenEvent = webSocket.onOpen.first;
if (config.connectionTimeout.inMilliseconds > 0) {
onOpenEvent = onOpenEvent.timeout(config.connectionTimeout);
}
await onOpenEvent;
return HtmlWebSocketChannel(webSocket);
}
感谢您的任何建议!
【问题讨论】: