如何在时间限制后使未来的计算超时?

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()。有两个例子:

  1. 超时后抛出异常
  final someHardTaskFuture = Future.delayed(const Duration(hours: 1), () => 42);
  final newFutureWithTimeoutAndException = someHardTaskFuture.timeout(const Duration(seconds: 3));
  1. Returns 超时默认值 (11)
  final someHardTaskFuture = Future.delayed(const Duration(hours: 1), () => 42);
  final newFutureWithTimeoutAndDefaultValue = someHardTaskFuture
      .timeout(const Duration(seconds: 3), onTimeout: () => 11);
  print(await newFutureWithTimeoutAndDefaultValue);