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)
这是使用 Remi 的示例Future.any,其中将使用首先返回的未来。另一个被丢弃。
因此,第一个未来是您的数据收集/慢速功能,另一个是当您的呼叫花费太长时间时的后备功能。
\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 ]);\nRun Code Online (Sandbox Code Playgroud)\n以下是 Flutter 页面的复制/粘贴示例:
\n(查看调试/运行输出窗口中的消息)
\nimport '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}\nRun Code Online (Sandbox Code Playgroud)\n
您可以使用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)
| 归档时间: |
|
| 查看次数: |
1934 次 |
| 最近记录: |