Day10 | Dart 非同步 - async/awiat

Async/Awiat

在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

参考资料

  1. https://dart.dev/codelabs/async-await#example-execution-within-async-functions
  2. https://www.youtube.com/watch?v=SmTCmDMi4BY&t=120s

<<:  D09 - 打开第一扇窗

>>:  [Android Studio 30天自我挑战] 练习APP-计算BMI

sed - 6 Hold Space简介

前篇回顾 sed - 简介 读取编辑文字档的好工具 sed - 2 Pattern sed - 3 ...

DAY 11 『 UIAlertController 』Part2

昨天分享如何从中间弹出、由下而上弹出 UIAlertController 今天会介绍: 显示多个按钮...

【day1】豚花돈꽃韩式料理三访

在近三个月的防疫禁止内用期间 最想念的食物之一就是韩式烤肉了 (不用自己动手烤的那一种) 这家豚花돈...

虹语岚访仲夏夜-21(专业的小四篇)

没有答案 也抓不住时间 独自成长 希望谁能发现 窗外阳光 季节又转一圈 遥远记忆 回不到的雨天 万...

防毒软件侦测篇

今天算是以病毒与防毒软件为主的方向。 这篇不在原本的安排之内, 不过昨天恶意程序分析之後, 发现有些...