等待特定时间的未来

Vid*_*rom 7 asynchronous future async-await dart flutter

您将如何等待特定时间的未来响应?

比如说,我们在关闭http请求之前发出一个http post请求并等待它的响应,但是,我们只等待3秒,否则我们关闭请求.

你会如何实现这一目标?

就像是

Future makePostReq() async{
  .... 

  await http response for 3 secs

  .... 

 if(response) {
  ... Do something with it
 }

 Http.close

} 
Run Code Online (Sandbox Code Playgroud)

San*_*inh 10

你可以很容易地做到

try {
       var response = await Http.get("YourUrl").timeout(const Duration(seconds: 3));
       if(response.statusCode == 200){
          print("Success");
       }else{
          print("Something wrong");
       }
 } on TimeoutException catch (e) {
     print('Timeout');
 } on Error catch (e) {
     print('Error: $e');
 }
Run Code Online (Sandbox Code Playgroud)

本示例将超时设置为 3 秒。如果已经 3 秒没有收到响应,它会抛出TimeoutException

导入这个:

import 'package:http/http.dart' as Http;
import 'dart:async';
Run Code Online (Sandbox Code Playgroud)


Bak*_*ker 8

Future.any([ asyncfunc , ...])

\n

这是使用 Remi 的示例Future.any,其中将使用首先返回的未来。另一个被丢弃。

\n

因此,第一个未来是您的数据收集/慢速功能,另一个是当您的呼叫花费太长时间时的后备功能。

\n
    dynamic result = await Future.any([\n      getData(fakeDelay: seconds), // \xe2\x86\x90 hope this returns first\n      timeoutAfter(sec: timeout, onTimeout: () => 'Timed Out!', ) // \xe2\x86\x90 waited too long, do this\n    ]);\n
Run Code Online (Sandbox Code Playgroud)\n

Flutter页面中的示例

\n

以下是 Flutter 页面的复制/粘贴示例:

\n

(查看调试/运行输出窗口中的消息)

\n
import 'package:flutter/material.dart';\n\nclass FutureTimeoutPage extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('Future or Timeout Page'),\n      ),\n      body: FutureAnyExample(),\n    );\n  }\n}\n\nclass FutureAnyExample extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      mainAxisAlignment: MainAxisAlignment.center,\n      children: [\n        Text('Complete before timeout or timeout:'),\n        SizedBox(height: 30,),\n        Row(\n          mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n          children: [\n            ElevatedButton(onPressed: () => getDataOrTimeout(seconds: 1, timeout: 3),\n                child: Text('In Time')),\n            ElevatedButton(onPressed: () => getDataOrTimeout(seconds: 5, timeout: 3),\n                child: Text('Too Slow'))\n          ],\n        )\n      ],\n    );\n  }\n\n  Future<void> getDataOrTimeout({int seconds, int timeout}) async {\n    /// In Future.any, put as many async functions as you need.\n    /// Whichever completes first, will be returned. All others are discarded\n    dynamic result = await Future.any([\n      getData(fakeDelay: seconds), // \xe2\x86\x90 hope this returns first\n      timeoutAfter(sec: timeout, onTimeout: () => 'Timed Out!', ) // \xe2\x86\x90 waited too long, do this\n    ]);\n\n    print(result);\n  }\n\n  /// Mock of a long-running operation like getting DB data, or API call\n  Future<String> getData({int fakeDelay}) async {\n    return Future.delayed(Duration(seconds: fakeDelay), () => 'Data returned!');\n  }\n\n  /// Do this in case my long-running op takes too long\n  /// Can run a function or just return some message\n  Future<dynamic> timeoutAfter({int sec, Function() onTimeout}) async {\n    return Future.delayed(Duration(seconds: sec), onTimeout);\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n


Rém*_*let 6

您可以使用Future.any构造函数来创建竞争条件

final result = await Future.any([
  Future.value(42),
  Future.delayed(const Duration(seconds: 3))
]);
Run Code Online (Sandbox Code Playgroud)

您也可以使用Future.timout方法

final result = await Future.value(42).timeout(const Duration(seconds: 3));
Run Code Online (Sandbox Code Playgroud)

  • 42是大问题的答案;关于生命、宇宙和一切的意义,所以,它就像一个非常重要的未来。就道格拉斯·亚当斯而言。 (3认同)