业务流程:请求用户个人信息,获取到用户个人信息后,为了使用方便,我们需要将其缓存在本地
Future<String> login(String userName,String password){
//... 用户登录
}
Future<String> getUserInfo(String id){
//... 获取用户信息
}
Future saveUserInfo(String userInfo){
//...保存用户信息
}
实现业务流程 Future版
login('zhangsan','*****').then((id){
return getUserInfo(id);
}).then((userInfo){
return saveUserInfo(userInfo)
}).then((e){
//...
}).catchError((e){
//错误处理
}).whenComplete((e){
//无论成功或失败都会走到这里
})
实现业务流程 async/await版
task() async {
try{
String id= awiat login('zhangsan','******');
String userInfo = await getUserInfo(id);
await saveUserInfo(userInfo);
//执行接下来的操作
}catch(e){
//错误处理
}
}
业务场景:等待多个异步任务都执行结束后才进行一些操作,比如我们有一个界面,需要先分别从两个网络接口获取数据,获取成功后,我们需要将两个接口数据进行特定的处理后再显示到UI界面上
Future.wait([
//模拟请求1
Future.delayed(new Duration(seconds:4),(){
return 'world';
},
//模拟请求2
Future.delayed(new Duration(seconds:2),(){
return 'hello';
}
]).then((results){
print(results[0]+results[1]); //输出 hello world
}).catchError((e){
//处理错误
}).whenComplete((e){
//无论成功或失败都会走到这里
});
业务场景:在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据或错误异常。 Stream 常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等
Stream.fromFutrues([
Future.delayed(new Duration(seconds:1),(){ return "hello 1"}),
Future.delayed(new Duration(seconds:4),(){ throw AssertionError("Error")}),
Future.delayed(new Duration(seconds:2),(){ return "hello 3"}),
]).listen((data){
print(data);
},onError:(e){
print(e.message)
},onDone:(){ //可选命名参
//
})
依次输出 hello1
hello 2
Error
网友评论