僅記錄flutter重要筆記
1. 多個(gè)請(qǐng)求依賴, 僅用于多個(gè)異步操作都完成后, 執(zhí)行其它操作, 關(guān)鍵語(yǔ)法: Future.wait[]
, "wait
"傳入異步操作的數(shù)組, 只有都返回結(jié)果了, 才會(huì)調(diào)用.then()
方法
Future.wait([
// 2秒后返回結(jié)果
Future.delayed(new Duration(seconds: 2), () {
return "hello";
}),
// 4秒后返回結(jié)果
Future.delayed(new Duration(seconds: 4), () {
return " world";
})
]).then((results){
print(results[0]+results[1]);
}).catchError((e){
print(e);
});
執(zhí)行結(jié)果: 4秒后打印
2. 回調(diào)地獄(Callback Hell)
a請(qǐng)求依賴b請(qǐng)求的結(jié)果, b請(qǐng)求依賴c請(qǐng)求的結(jié)果, 大概就是 c -> b -> a
正常做法大概是這樣的:
//先分別定義各個(gè)異步任務(wù)
Future<String> login(String userName, String pwd){
...
//用戶登錄
};
Future<String> getUserInfo(String id){
...
//獲取用戶信息
};
Future saveUserInfo(String userInfo){
...
// 保存用戶信息
};
//再進(jìn)行調(diào)用
login("alice","******").then((id){
//登錄成功后通過,id獲取用戶信息
getUserInfo(id).then((userInfo){
//獲取用戶信息后保存
saveUserInfo(userInfo).then((){
//保存用戶信息,接下來執(zhí)行其它操作
...
});
});
})
這種寫代碼的方式簡(jiǎn)直不能忍
關(guān)鍵方法, Future.then()
, 這個(gè)方法返回的還是一個(gè) Future
, 可以很好的鏈?zhǔn)秸{(diào)用, 所以優(yōu)雅些是這樣的
login("alice","******").then((id){
return getUserInfo(id);
}).then((userInfo){
return saveUserInfo(userInfo);
}).then((e){
//執(zhí)行接下來的操作
}).catchError((e){
//錯(cuò)誤處理
print(e);
});
- 但是 , 似乎還是有問題, 還有一層嵌套呢, 咋搞?
關(guān)鍵方法: 可以使用 async/await
來消除 callback hell
async
用來表示函數(shù)是異步的沪么,定義的函數(shù)會(huì)返回一個(gè)Future
對(duì)象械蹋,可以使用then()
方法添加回調(diào)函數(shù)检激。
await
后面是一個(gè)Future
齐莲,表示等待該異步任務(wù)完成嚣鄙,異步完成后才會(huì)往下走放祟;await
必須出現(xiàn)在 async
函數(shù)內(nèi)部鳍怨。
所以再優(yōu)雅些這樣的
task() async {
try{
String id = await login("alice","******");
String userInfo = await getUserInfo(id);
await saveUserInfo(userInfo);
//執(zhí)行接下來的操作
} catch(e){
//錯(cuò)誤處理
print(e);
}
}