作者 | 弗拉德
起源 | 弗拉德(公众号:fulade_me)
异步
Dart 代码库中有大量返回Future
或Stream
对象的函数,这些函数都是异步的,它们会在耗时操作执行结束前间接返回而不会期待耗时操作执行结束。async
和await
关键字用于实现异步编程,并且让你的代码看起来就像是同步的一样。
Future
能够通过上面两种形式,取得Future
执行实现的后果:
- 应用
async
和await
; - 应用
Future API
;
应用async
和await
的代码是异步的,然而看起来有点像同步代码。例如,上面的代码应用await
期待异步函数的执行后果。
await lookUpVersion();
必须在带有async
关键字的异步函数中应用 await
:
Future checkVersion() async {
var version = await lookUpVersion();
// 应用 version 持续解决逻辑
}
只管异步函数能够解决耗时操作,然而它并不会期待这些耗时操作实现,异步函数执行时会在其遇到第一个 await
表达式的时候返回一个Future
对象,而后期待await
表达式执行结束后继续执行。
应用try
、catch
以及finally
来解决应用await
导致的异样:
try {
version = await lookUpVersion();
} catch (e) {
// 无奈找到版本时做出的反馈
}
你能够在异步函数中屡次应用await
关键字。例如,上面代码中期待了三次函数后果:
var entrypoint = await findEntrypoint();
var exitCode = await runExecutable(entrypoint, args);
await flushThenExit(exitCode);
await
表达式的返回值通常是一个Future
对象;
如果不是的话也会主动将其包裹在一个Future
对象里。Future
对象代表一个”承诺”,await
表达式会阻塞直到须要的对象返回。
如果在应用await
时导致编译谬误,请确保await
在一个异步函数中应用。例如,如果想在main()
函数中应用await
,那么main()
函数就必须应用async
关键字标识。
Future main() async {
checkVersion();
print('在 Main 函数中执行:版本是 ${await lookUpVersion()}');
}
申明异步函数
定义异步函数只需在一般办法上加上async
关键字即可。
将关键字async
增加到函数并让其返回一个Future
对象。假如有如下返回String
对象的办法:
String lookUpVersion() => '1.0.0';
将其改为异步函数,返回值是Future
:
Future<String> lookUpVersion() async => '1.0.0';
留神,函数体不须要应用Future API
。如有必要,Dart
会创立Future
对象。
如果函数没有返回有效值,须要设置其返回类型为 Future<void>
Stream
Stream
也是用于接管异步事件数据,和Future
不同的是,它能够接管多个异步操作的后果(胜利或失败)。 也就是说,在执行异步工作时,能够通过屡次触发胜利或失败事件来传递后果数据或谬误异样。Stream
罕用于会屡次读取数据的异步工作场景,如网络内容下载、文件读写等。举个例子:
Stream.fromFutures([
// 1秒后返回后果
Future.delayed(new Duration(seconds: 1), () {
return "hello 1";
}),
// 抛出一个异样
Future.delayed(new Duration(seconds: 2),(){
throw AssertionError("Error");
}),
// 3秒后返回后果
Future.delayed(new Duration(seconds: 3), () {
return "hello 3";
})
]).listen((data){
print(data);
}, onError: (e){
print(e.message);
},onDone: (){
});
下面的代码顺次会输入:
hello 1
Error
hello 3
发表回复