在Dart中我们可以使用 async
来代表这是一个非同步的function
Future<String> fetchData2() async => 'data';
这里的重点是:
就算我没有另外用 Future
的constructor「 只要是 async function
就是会回传Future
」,因为执行绪会用非同步的方式处理的话那也就表示他并不会马上被执行,也代表我在处理它时势必要用Future
在处理。
回到昨天的问题「我该如何将Future
里的值取出来放到别的变数」
其实也很简单就是使用 await
这个语法:
final data = await fetchData();
print('$data');
但另外一个重点是 await
必须要在 async function
才能使用。
void main(List<String> arguments) async {
final data = await fetchData();
print('$data');
}
await
是一种让我们在非同步里使用同步的语法,意思是被加上await
的会用同步的方式在运行:
print('n1');
final data = await outputAfter3s('asyncData1');
print('n2');
final data2 = await outputAfter3s('asyncData2');
print('n3');
print('$data');
print('$data2');
输出会变成这样:
n1
// 停顿3秒
n2
// 停顿3秒
n3
asyncData1
asyncData2
表示await
真的会使这个function 停顿三秒後再继续往下执行,但这样子是不是代表我整个程序都会因此被停住三秒?
我们另外宣告一个async function
并把这些非同步操作移出去:
void fetch() async {
print('n1');
final data = await outputAfter3s('asyncData1');
print('n2');
final data2 = await outputAfter3s('asyncData2');
print('n3');
print('$data');
print('$data2');
}
void main(List<String> arguments) {
fetch();
print('Hello world');
}
还记得前面所说的「 只要是 async function
就是会回传Future
」吗,没错虽然对於这个function他是会被当作用同步的方式在执行,但对於其他function 这个async function
还是非同步的,只有在async function
里剩下的程序码会被阻塞住。
n1
Hello world
// 停顿3秒
n2
// 停顿3秒
n3
asyncData1
那在async function
里要如何做错误处理,其实就跟一般的错误处理一样是使用 try catch
就好,也可以使用 finaly
用来当作try
里面的code 执行完需要执行的部分。
try {
throwError();
final data = await fetchData();
print('$data');
} catch (err) {
print(err);
}finally {
print('done');
}
async/awiat 另外一个功用就是可以拿来处理 Stream
就如同我们用 for ... in
操作一个 List
,我们只要用 await for ... in
就可以拿来操作一个Stream
:
Future<int> getTotal(Stream<int> stream) async {
var total = 0;
await for (var number in stream) {
total += number;
}
return total;
}
// ...
print(await getTotal(_numberStream));
// 10
至於什麽Stream
可以先想像成一群 Future
,就像 List
那样只是我们在迭代 List
时可以马上获得结果,但 Stream
没办法。
今天的程序码:
https://github.com/zxc469469/dart-playground/tree/Day10/async-await
本来是预计Stream
与Async/Awiat 放到同一篇,只是打算放在同一篇但刚好遇到最近工作较忙只好切成两篇来撑一下文章数了,导致这篇看起来有点水QQ
参考资料
>>: [Android Studio 30天自我挑战] 练习APP-计算BMI
前篇回顾 sed - 简介 读取编辑文字档的好工具 sed - 2 Pattern sed - 3 ...
昨天分享如何从中间弹出、由下而上弹出 UIAlertController 今天会介绍: 显示多个按钮...
在近三个月的防疫禁止内用期间 最想念的食物之一就是韩式烤肉了 (不用自己动手烤的那一种) 这家豚花돈...
没有答案 也抓不住时间 独自成长 希望谁能发现 窗外阳光 季节又转一圈 遥远记忆 回不到的雨天 万...
今天算是以病毒与防毒软件为主的方向。 这篇不在原本的安排之内, 不过昨天恶意程序分析之後, 发现有些...