Flutter的四种异步方式
前言
对于任务一种开发语言来说,只要涉及到IO等耗时操作,基本上都会涉及到异步操作,比如java的asyncThread,Android 的 Handler+Thread,JavaScript 的Promise 等等。
一、Flutter有哪些异步操作方式?
主要有 Future.delay, Future.wait,async/await,Stream这四种方式
二、使用步骤
1. Future.delay
Future.delay表示一般延时多长时间执行任务,主要适用于单个任务的延时操作
void request() {
Future.delayed(Duration(seconds: 3),(){
// 网络请求
return DioUtil().request(url, data: map);
}).then((data){
//处理返回的接口数据
}).onError((error, stackTrace){
//请求失败的逻辑
}).whenComplete((){
//无论成功或失败都会走到这里
});
}
2. Future.wait
Future.wait主要使用在多个异步任务全部结束之后才能进行下一步的操作,比如说有两个接口请求网络,必须这两个接口都成功执行才能执行then的成功的回调,只要有一个任务执行失败,就会执行错误回调,例如
void request2() {
Future.wait([
Future.delayed(Duration(seconds: 3), () {
// 获取用户信息
return DioUtil().request(url, data: map);
}).then((data) {
//处理返回的接口数据
}).onError((error, stackTrace) {
//请求失败的逻辑
}),
Future.delayed(Duration(seconds: 3), () {
// 获取用户任务数量信息
return DioUtil().request(url, data: map);
}).then((data) {
//处理返回的接口数据
}).onError((error, stackTrace) {
//请求失败的逻辑
})
]).then((value){
// value[0] 就是返回用户信息的数据
// value[1] 就是返回任务数量信息的数据
}).catchError((e) {
print(e);
});
}
上面的任务Future数组和结果value 数组 是位置一一对应的,不论谁的耗时更长都不影响他们在数组的顺序。
3. async/await
类似于JavaScript 的async/await 的功能,async 用来表示函数是异步的,await 表示等待该异步任务完成,使用这种方式让异步流用同步代码的方式表示出来了,一般的网络请求可以采用这种这种方式,这种方式也是我用的最多的方式
void request2() async {
var result = await DioUtil().request(url, data: map);
// 处理相应的逻辑
}
4. Stream
Stream 与Future 不同吗,他可以接收多个异步操作的结果(成功或者失败),比如下面有两次下载文件请求和一次报错,相应的listen(data) 回调用两次,onError会调用一次,经常用于网络下载,文件读写等。
void request3() {
Stream.fromFutures([
// 下载文件1
Future.delayed(Duration(seconds: 1), () {
return DioUtil().download(url1, data: map);
}),
// 报错
Future.delayed(Duration(seconds: 2), () {
throw AssertionError("Error");
}),
// 下载文件2
Future.delayed(Duration(seconds: 3), () {
return DioUtil().download(url2, data: map);
})
]).listen((data) {
// 处理对应的逻辑
print(data);
}, onError: (e) {
// 处理对应的报错逻辑
print(e.toString());
}, onDone: () {
print("onDone");
});
}
总结
这几种异步方式都各有优缺点,具体使用方式要结合你的使用场景,因地制宜,选择最适合的方式。