Dart中的async/await與C#等其他語言中的用法相似,這也讓那些有過這些語言使用經驗的人很容易上手。
然而,即使你沒有過任何使用async/await異步編程的經驗的話,你也會發現Dart中的async/await也是非常容易上手的。
只要記住這里的async/await和其他異步編程語言有最基本的一致性就行了。
首先,你要先理解兩個關鍵字,就是async和await,你想要運行的任何一個異步函數都要在函數簽名上增加async這個關鍵字。
這個關鍵字是在函數的右邊,緊跟函數名:
void hello() async {
print('something exciting is going to happen here...');
}
當然,你想要異步運行的函數可能會有很多其他的操作(比如文件I/O,或者網絡操作),別急,我會在接下來說:
第一,我們先來說await,這個關鍵字的意思就是說:繼續然后異步執行這個函數,函數執行完畢后,繼續執行下一行代碼。
下面的部分代碼就是async/await用法的最好的解釋,你也可以參考著這么寫:
void main() async {
await hello();
print('all done');
}
上面的這段代碼有兩點需要著重注意:
1.我們在main函數上注明了async關鍵字,因為,我們要異步執行hello方法
2.我們把await關鍵字直接放到了我們要異步執行的方法的前面,所以,這也是我們最常用的async/await組合方式。
你只需要記住,只要你想用await,那么就要確認所有調用的方法以及任何這個方法里面調用的方法都要用async注明
那么async/await是怎么工作的呢?
1.當你await任何異步函數的時候,調用者的代碼的執行就會掛起,這個時候,async方法正在被執行。當async 操作執行完畢后,
await的執行結果會包含在一個Future對象中返回。
2.看下下面這個簡單的例子,我們把four()這個函數的返回值是賦值給了變量X,然后,我們打印看看是不是我們想要的結果
import 'dart:async';
void main() async {
var x = await four();
print(x);
}
Future<int> four() async {
return 4;
}
### 一個更實際的例子
其實,你想要異步執行過代碼的原因就是你知道你要執行一段運行時間比較長的函數,然而你不希望在函數執行期間程序對用戶的操作沒有任何反應。我們創建了一個耗時2s的函數,然后異步執行。
import 'dart:async';
class Employee {
int id;
String firstName;
String lastName;
Employee(this.id, this.firstName, this.lastName);
}
void main() async {
print("getting employee...");
var x = await getEmployee(33);
print("Got back ${x.firstName} ${x.lastName} with id# ${x.id}");
}
Future<Employee> getEmployee(int id) async {
//Simluate what a real service call delay may look like by delaying 2 seconds
await Future<Employee>.delayed(const Duration(seconds: 2));
//and then return an employee - lets pretend we grabbed this out of a database ??
var e = new Employee(id, "Joe", "Coder");
return e;
}
如果你運行上面的代碼,你就會馬上看到“getting employee”打印出來,然后2s之后,employee返回然后打印出詳細信息。
### 多個異步調用
在有些編程語言中,如果他們不支持async/await語法而不得不做多個異步調用是一個很頭疼的事情,這是因為,你要先做第一個異步調用然后在第二個,第三個。。。,這也就是所謂的回調地獄。
然而,有了async/await,你就可以線性的調用而不用潛逃,就像寫非異步代碼那樣。
看看你下面的代碼,我們有三個異步的方法,然后我們想同時,按順序異步調用他們。
import 'dart:async';
Future<String> firstAsync() async {
await Future<String>.delayed(const Duration(seconds: 2));
return "First!";
}
Future<String> secondAsync() async {
await Future<String>.delayed(const Duration(seconds: 2));
return "Second!";
}
Future<String> thirdAsync() async {
await Future<String>.delayed(const Duration(seconds: 2));
return "Third!";
}
void main() async {
var f = await firstAsync();
print(f);
var s = await secondAsync();
print(s);
var t = await thirdAsync();
print(t);
print('done');
}
打印結果:
First!
Second!
Third!
done
參考:https://www.educative.io/edpresso/darts-async-await-in-flutter