处理 Future
使用 async 和 await 关键字的代码是异步的。要使用 await,代码必须在异步函数(使用 async 标记的函数)中,await表示等待异步函数的执行结果。
Future checkVersion() async {
var version = await lookUpVersion();
// Do something with version
}
在 await 表达式中, 表达式的值通常是一个 Future 对象; 如果不是会被自动包装成一个 Future 对象。await 表达式 执行的结果为这个返回的对象。 await 表达式会阻塞代码的执行,直到需要的对象返回为止。这个和java的Future很像,有await标记的函数在调用的时候,调用函数必须要有async
声明异步函数
比如下面的一段代码,获取版本号
String lookUpVersion() => '1.0.0';
如果实现非常耗时,将其更改为异步函数,返回值是 Future 。
Future<String> lookUpVersion() async => '1.0.0';
注意,函数体不需要使用Future API。 如有必要, Dart 会创建 Future 对象。
如果函数没有返回有效值, 需要设置其返回类型为 Future 。
处理 Stream
await for (varOrType identifier in expression) {
// Executes each time the stream emits a value.
}
上面 表达式 返回的值必须是 Stream 类型。 执行流程如下:
1,等待,直到流发出一个值。
2,执行 for 循环体,将变量设置为该发出的值
3,重复1和2,直到关闭流。
break和return 语句可以停止接收 stream 的数据
Future main() async {
// ...
await for (var request in requestServer) {
handleRequest(request);
}
// ...
}