Flutter 三点二:Dart 异步 async 和 await

async 和 await

  • Future 链式调用 更清晰
  • 异步操作依赖关系比较复杂 可使用async await
  • async await 调用逻辑更清晰
  • async await 异常处理 try{}catch(){} 即可
  • async 修饰的方法 总是返回Future对象 不会阻塞主线程
  • await 关键字只有在async修饰的方法内才有效
  • 都是把事件交给 EventLoop
登录流程Future写法
void main() {Future.value(["username","password"]).then((value){login(value[0],value[1]);print("${DateTime.now().millisecondsSinceEpoch} >> 登录中...");sleep(Duration(seconds: 5));return '{"id": 10001,"name": "John","classGrade": "三年二班","birthday": "2005-12-12 12:12:12", "age": 30}';}).then((value){return value;}).then((value){print("${DateTime.now().millisecondsSinceEpoch} >> "+value);  //jsonvar json = jsonDecode(value);int id = json['id'];getUserInfo(id);print("${DateTime.now().millisecondsSinceEpoch} >> 获取用户信息...");sleep(Duration(seconds: 5));return "成功,缓存数据,跳转首页";}).catchError((value){}).whenComplete((){print("登录流程结束!");});
}login(String username,String password){print("${DateTime.now().millisecondsSinceEpoch} >> ${username}请求登录!");
}
getUserInfo(int id){print("${DateTime.now().millisecondsSinceEpoch} >> ${id}获取用户信息!");
}

运行结果

1703727827384 >> username请求登录!
1703727827384 >> 登录中...
1703727832400 >> {"id": 10001,"name": "John","classGrade": "三年二班","birthday": "2005-12-12 12:12:12", "age": 30}
1703727832418 >> 10001获取用户信息!
1703727832418 >> 获取用户信息...
登录流程结束!
async/await 写法

import 'dart:convert';
import 'dart:io';void main() async{var loginResult = await login("aaa", "123");var userInfo = await getUserInfo(loginResult);print(userInfo);
}Future<String> login(String username,String password){print("${DateTime.now().millisecondsSinceEpoch} >> ${username}请求登录!");return  Future.value([username,password]).then((value){print("${DateTime.now().millisecondsSinceEpoch} >> 登录中...");sleep(Duration(seconds: 5));return '{"id": 10001,"name": "John","classGrade": "三年二班","birthday": "2005-12-12 12:12:12", "age": 30}';}).then((value){return value;});
}
Future<String> getUserInfo(String value){return Future((){print("${DateTime.now().millisecondsSinceEpoch} >> "+value);  //jsonvar json = jsonDecode(value);print("${DateTime.now().millisecondsSinceEpoch} >> 获取用户信息...");sleep(Duration(seconds: 5));return "成功,缓存数据,跳转首页";});
}

请求结果

1703727905612 >> aaa请求登录!
1703727905617 >> 登录中...   //5s等待返回结果
1703727910642 >> {"id": 10001,"name": "John","classGrade": "三年二班","birthday": "2005-12-12 12:12:12", "age": 30}
1703727910660 >> 获取用户信息...    //5s等待
1703727915670 >> 成功,缓存数据,跳转首页   
async 修饰的方法 总是返回Future对象 不会阻塞主线程
import 'dart:convert';
import 'dart:io';void main(){var login = startLogin();print("login.runtimeType>>${login.runtimeType}");
}startLogin() async{var loginResult = await login("aaa", "123");var userInfo = await getUserInfo(loginResult);print("${DateTime.now().millisecondsSinceEpoch} >> "+userInfo);
}Future<String> login(String username,String password){return  Future.value([username,password]).then((value){print("${DateTime.now().millisecondsSinceEpoch} >> 登录中...");sleep(Duration(seconds: 5));return '{"id": 10001,"name": "John","classGrade": "三年二班","birthday": "2005-12-12 12:12:12", "age": 30}';}).then((value){return value;});
}
Future<String> getUserInfo(String value){return Future((){print("${DateTime.now().millisecondsSinceEpoch} >> "+value);  //jsonvar json = jsonDecode(value);print("${DateTime.now().millisecondsSinceEpoch} >> 获取用户信息...");sleep(Duration(seconds: 5));return "成功,缓存数据,跳转首页";});
}

结果:

login.runtimeType>>Future<dynamic>  //类型是Future
await 关键字只有在async修饰的方法内才有效

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/583317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化能为我们带来哪些好处?

在信息爆炸的时代&#xff0c;数据量呈指数级增长&#xff0c;企业和个人都面临着处理大量信息的挑战。在这个背景下&#xff0c;数据可视化崭露头角&#xff0c;成为解决复杂数据呈现和理解难题的得力工具。那么&#xff0c;数据可视化究竟能为我们带来哪些好处呢&#xff1f;…

SeaTunnel流处理同步MySQL数据至ClickHouse

ClickHouse是一种OLAP类型的列式数据库管理系统&#xff0c;ClickHouse完美的实现了OLAP和列式数据库的优势&#xff0c;因此在大数据量的分析处理应用中ClickHouse表现很优秀。 SeaTunnel是一个分布式、高性能、易扩展、用于海量数据同步和转化的数据集成平台。用户只需要配置…

YOLOv5改进 | 2023注意力篇 | BiFormer双层路由注意力机制(Bi-level Routing Attention)

一、本文介绍 BiFormer是一种结合了Bi-level Routing Attention的视觉Transformer模型&#xff0c;BiFormer模型的核心思想是引入了双层路由注意力机制。在BiFormer中&#xff0c;每个图像块都与一个位置路由器相关联。这些位置路由器根据特定的规则将图像块分配给上层和下层路…

网站提示“不安全”怎么解决

在互联网中&#xff0c;安全问题至关重要。访问某些网站时&#xff0c;可能会遇到“不安全”警告&#xff0c;通常是由于缺乏SSL证书。SSL证书是数字证书&#xff0c;用于确保互联网通信的安全和保密。 “不安全”问题通常源于缺少SSL证书。SSL通过加密通信&#xff0c;防止第三…

mac下jd-gui提示没有找到合适的jdk版本

mac下jd-gui提示jdk有问题 背景解决看一下是不是真有问题了方法一&#xff1a;修改启动脚本方法二&#xff1a;设置launchd环境变量 扩展动态切jdk脚本(.bash_profile) 背景 配置了动态jdk后&#xff0c;再次使用JD-GUI提示没有找到合适的jdk版本。 解决 看一下是不是真有问题…

学习使用wps将ppt的页面保存为图片的方法

学习使用wps将ppt的页面保存为图片的方法 方案 方案 1、打开ppt&#xff0c;点击文件&#xff0c;另存为&#xff0c;选择文件类型为图片格式&#xff0c;jpg或者png&#xff0c;如下图&#xff1a; 2、点击每张幻灯片

MacOS安装JDK8

下载 oracle官网下载。 oracle官网 镜像下载。 华为&#xff1a;https://repo.huaweicloud.com/java/injdk&#xff1a;https://www.injdk.cn 安装 下载完成后双击pkg&#xff0c;按提示流程安装。 安装完成后打开终端窗口&#xff0c;执行命令查看版本&#xff1a; java -…

MySql 性能优化神器之 explain 详解

目录 一. 前言 二. explain 详解 2.1. 概念 2.2. 数据准备 2.3. id 2.3.1. id 相同&#xff0c;执行顺序由上至下 2.3.2. id 不同&#xff0c;数字越大优先级越高 2.3.3. id 存在相同的和不同的 2.4. select_type 2.5. table 2.6. partitions 2.7. type 2.7.1. sy…

【Python基础】字符串

文章目录 [toc]什么是字符串索引示例索引越界 切片语法示例 字符串方法find()方法rfind()方法count()方法replace()方法 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python基础 什么是字符串 如下定义的变量url存储的是字符串类型的值 url www.baidu.com print(url)u…

【Unity入门】RequireComponent的使用

RequireComponent的作用 RequireComponent 属性自动将所需的组件添加为依赖项。 当某个脚本必须依赖其他脚本或者组件共同使用时&#xff0c;为了避免人为添加过程的操作失误&#xff0c;可以在代码中使用RequireComponent&#xff0c;它的作用就是添加该脚本时&#xff0c;会…

[玩转AIGC]LLaMA2之如何跑llama2.c的chat模式

前言&#xff1a;之前我们关于llama2的相关内容主要停留在gc层面&#xff0c;没介绍chat模式&#xff0c;本文将简单介绍下llama2.c的chat模式如何跑起来。训练就算了&#xff0c;没卡训练不起来的&#xff0c;但是用CPU来对别人训练好的模型进行推理还是绰绰有余的&#xff0c…

无监督学习(上)

我们实际用到的项目大都是有监督的&#xff0c;而人工智能未来的一大难点将会是无监督学习。在前面说过的降维算法&#xff0c;大部分都是无监督&#xff0c;除了LDA。 无监督算法有聚类&#xff0c;密度估计&#xff0c;常常用在做分类或者异常检测上。 一.聚类 聚类就是识…

机器学习分类

1. 监督学习 监督学习指的是人们给机器一大堆标记好的数据&#xff0c;比如&#xff1a; 一大堆照片&#xff0c;标记出哪些是猫的照片&#xff0c;哪些是狗的照片 让机器自己学习归纳出算法或模型 使用该算法或模型判断出其他没有标记的照片是否是猫或狗 上述流程如下图所…

2023中国企业级存储市场:整体韧性成长,领域此消彼长

多年之后回头看&#xff0c;2023年也许是中国企业级存储市场标志性的一年。 后疫情时代的开启&#xff0c;中国数字经济快速发展、数据产业方兴未艾&#xff0c;为数据存储市场带来了前所未有的活力&#xff1b;与此同时&#xff0c;外部环境的不确定性骤增&#xff0c;人工智…

Qt+Opencv:人脸检测

话接上一篇&#xff0c;我们仍使用在上篇《QtOpencv&#xff1a;Qt中部署opencv》创建的Qt项目来测试opencv提供的sample。 在正式开始本篇之前&#xff0c;我们先说做一下准备工作&#xff1a; 一、opencv官方文档 学习最权威和最可靠的方式&#xff0c;就是阅读官方文档和…

大数据与人工智能|万物皆算法(第三节)

要点一&#xff1a;数据与智能的关系 1. 一切的核心都是数据&#xff0c;数据和智能之间是密切相关的。 数据是对客观现实的描述&#xff0c;而信息是数据转化而来的。 例如&#xff0c;24是数据&#xff0c;但说“今天的气温是24摄氏度”是信息&#xff0c;而说“班可以分成24…

【51单片机系列】DS18B20温度传感器扩展实验之设计一个智能温控系统

本文是关于DS18B20温度传感器的一个扩展实验。 文章目录 一、相关元件介绍二、实验分析三、proteus原理图设计四、软件设计 本扩展实验实现的功能&#xff1a;利用DS18B20设计一个智能温度控制系统&#xff0c;具有温度上下限值设定。当温度高于上限值时&#xff0c;电机开启&a…

BDTC2023:CloudberryDB开源创新与实践

中国大数据技术大会&#xff08;BDTC&#xff09;由中国计算机学会&#xff08;CCF&#xff09;创立于2008年&#xff0c;已经成为国内外极具行业实践的专业大数据交流平台。12月22日-24日&#xff0c;第十七届中国大数据技术大会&#xff08;BDTC 2023&#xff09;在广州举行。…

创建加密分区或者文件

文章目录 [GParted 中已清除的分区与未格式化的分区](https://superuser.com/questions/706624/cleared-vs-unformatted-partition-in-gparted)创建加密分区解密创建的加密分区以便挂载格式化设备未具体的格式&#xff08;这里为ext4格式&#xff09;创建挂载点目录挂载加密的文…

多值类别特征加入CTR预估模型的方法

欢迎关注公众号&#xff1a;数据运营入表资产化服务 获取更多算法源码材料 2023数据资源入表白皮书&#xff0c;推荐系统源码下载-CSDN博客 用友BIP数据资产入表解决方案白皮书&#xff0c;推荐系统源码下载-CSDN博客 我们都知道一般单值类别特征加入到CTR预估模型的方法是先…