Dart 为什么可以';我不能赶上这次吗
我目前正在为我想要控制连接超时值的Web构建Stomp WebSocket连接。这是我的连接方法:Dart 为什么可以';我不能赶上这次吗,dart,websocket,dart-html,Dart,Websocket,Dart Html,我目前正在为我想要控制连接超时值的Web构建Stomp WebSocket连接。这是我的连接方法: Future<WebSocketChannel> connect(StompConfig config) { final completer = Completer<HtmlWebSocketChannel>(); final webSocket = WebSocket(config.url)..binaryType = BinaryType.list.value;
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;
}
遗憾的是,我似乎无法捕获由onOpenEvent.timeout(..)
引发的TimeoutException
。相反,它只打印以下内容(看似未捕获的异常):
我做错了什么?我以前的代码看起来是这样的,适用于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);
}
Future connect(StompConfig)异步{
最终webSocket=webSocket(config.url)…binaryType=binaryType.list.value;
var onOpenEvent=webSocket.onOpen.first;
如果(config.connectionTimeout.inmillizes>0){
onOpenEvent=onOpenEvent.timeout(config.connectionTimeout);
}
等待事件的发生;
返回HtmlWebSocketChannel(webSocket);
}
谢谢你的建议 你可以捕获异常,但你不能。
声明
onOpenEvent.then((值){
completer.complete(HtmlWebSocketChannel(webSocket));
});
侦听打开事件的未来,并创建一个新的未来。
当onOpenEvent在超时异常下完成时,此调用将获得错误,并且由于它不处理异常,因此它返回的未来也将在相同异常下完成
因为上面的语句丢弃了未来,所以没有人接触过未来,因此未来的结果是一个未处理的错误
您以前的代码工作的原因是await onOpenEvent
将(重新)抛出该错误,并使其成为整个connect
调用的结果
新代码无法使该错误到达connect
函数调用,onOpenEvent。然后(…)
在connect
返回后,未来可能会完成
您可以尝试向调用添加错误处理程序,然后调用:
onOpenEvent.then((值){
completer.complete(HtmlWebSocketChannel(webSocket));
},onError:(错误,StackTrace StackTrace){
如果(!completer.isCompleted)completer.completeError(错误,堆栈跟踪);
});
webSocket.onError.first.then((错误){
如果(!completer.isCompleted){
completer.completeError(WebSocketChannelException.from(err));
}
});
谢谢!这是有道理的。相反,我在完成器的未来
上设置了一个超时,并返回该未来。
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
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);
}