如何在时间限制后使未来的计算超时?
How to timeout a future computation after a timeLimit?
定义 Future 时如下:
Future<HttpRequest> httpRequest = HttpRequest.request(url,
method: method, requestHeaders: requestHeaders);
我想在 5 秒后处理超时。我正在这样写我的代码:
httpRequest.timeout(const Duration (seconds:5),onTimeout : _onTimeout());
我的超时函数在哪里:
_onTimeout() => print("Time Out occurs");
根据 Future timeout() method documentation ,如果省略 onTimeout
,超时将导致返回的未来以 TimeoutException
完成。但是使用我的代码,我的方法 _onTimeout()
被正确调用(但立即,而不是在 5 秒之后)并且我总是得到
TimeException after 5 seconds... (TimeoutException after 0:00:05.000000: Future not completed )
我是不是漏掉了什么?
更改此行
httpRequest.timeout(const Duration (seconds:5),onTimeout : _onTimeout());
到
httpRequest.timeout(const Duration (seconds:5),onTimeout : () => _onTimeout());
或者只传递对函数的引用(没有 ()
)
httpRequest.timeout(const Duration (seconds:5),onTimeout : _onTimeout);
这样调用 _onTimeout()
的闭包将被传递给 timeout()
。
在前面的代码中,_onTimeout()
调用的结果将传递给 timeout()
Future.await[_doSome].then((data){
print(data);
}).timeout(Duration(seconds: 10));
使用async/await风格。您可以将 .timeout
添加到您正在等待的任何 Future
。
final result = await InternetAddress
.lookup('example.com')
.timeout(
Duration(seconds: 10),
onTimeout: () => throw TimeoutException('Can\'t connect in 10 seconds.'),
);
为了通过超时停止任何 Future
,可以使用 timeout()。有两个例子:
- 超时后抛出异常
final someHardTaskFuture = Future.delayed(const Duration(hours: 1), () => 42);
final newFutureWithTimeoutAndException = someHardTaskFuture.timeout(const Duration(seconds: 3));
- Returns 超时默认值 (11)
final someHardTaskFuture = Future.delayed(const Duration(hours: 1), () => 42);
final newFutureWithTimeoutAndDefaultValue = someHardTaskFuture
.timeout(const Duration(seconds: 3), onTimeout: () => 11);
print(await newFutureWithTimeoutAndDefaultValue);
定义 Future 时如下:
Future<HttpRequest> httpRequest = HttpRequest.request(url,
method: method, requestHeaders: requestHeaders);
我想在 5 秒后处理超时。我正在这样写我的代码:
httpRequest.timeout(const Duration (seconds:5),onTimeout : _onTimeout());
我的超时函数在哪里:
_onTimeout() => print("Time Out occurs");
根据 Future timeout() method documentation ,如果省略 onTimeout
,超时将导致返回的未来以 TimeoutException
完成。但是使用我的代码,我的方法 _onTimeout()
被正确调用(但立即,而不是在 5 秒之后)并且我总是得到
TimeException after 5 seconds... (TimeoutException after 0:00:05.000000: Future not completed )
我是不是漏掉了什么?
更改此行
httpRequest.timeout(const Duration (seconds:5),onTimeout : _onTimeout());
到
httpRequest.timeout(const Duration (seconds:5),onTimeout : () => _onTimeout());
或者只传递对函数的引用(没有 ()
)
httpRequest.timeout(const Duration (seconds:5),onTimeout : _onTimeout);
这样调用 _onTimeout()
的闭包将被传递给 timeout()
。
在前面的代码中,_onTimeout()
调用的结果将传递给 timeout()
Future.await[_doSome].then((data){
print(data);
}).timeout(Duration(seconds: 10));
使用async/await风格。您可以将 .timeout
添加到您正在等待的任何 Future
。
final result = await InternetAddress
.lookup('example.com')
.timeout(
Duration(seconds: 10),
onTimeout: () => throw TimeoutException('Can\'t connect in 10 seconds.'),
);
为了通过超时停止任何 Future
,可以使用 timeout()。有两个例子:
- 超时后抛出异常
final someHardTaskFuture = Future.delayed(const Duration(hours: 1), () => 42);
final newFutureWithTimeoutAndException = someHardTaskFuture.timeout(const Duration(seconds: 3));
- Returns 超时默认值 (11)
final someHardTaskFuture = Future.delayed(const Duration(hours: 1), () => 42);
final newFutureWithTimeoutAndDefaultValue = someHardTaskFuture
.timeout(const Duration(seconds: 3), onTimeout: () => 11);
print(await newFutureWithTimeoutAndDefaultValue);