Dart是单线程语言,::dart:async::库是Dart 语言支持异步编程的基础库。库中提供了Future 类和Stream 类。—呆瓜笔记


Future

  • ::Future:: 代表着在将来会获取到一个值的异步函数
  • ::await:: 返回一个Future值
  • ::async:: 标记一个函数为异步
  • ::.delayed()::延迟执行
  • ::.then():: 注册一函数,在Future成功返回后执行
  • ::.wait():: 等待一组函数执行完成,后通常与.then搭配使用
  • ::.catchError():: 捕捉Future返回异常
1
2
3
4
5
6
7
8
9
10
11
12
13
import 'dart:async';
Future gatherNewsReports_async() async {
String path = 'https://www.dartlang.org/f/dailyNewsDigest.txt';
return (await HttpRequest.getString(path));
}
Future printDailyNewsDigest_async() async {
String news = await gatherNewsReports_async();
print(news);
}
// Parallel processing using the Future API
Future.wait([expensiveA(), expensiveB(), expensiveC()])
.then((List responses) => chooseBestResponse(responses))
.catchError((e) => handleError(e));

Stream

一个Stream 对象提供了一个异步数据的队列。在这个队列中可能包含事件(鼠标点击)、大数据块。权且相当于Future复数..

  • Stream是一个返回数据的异步队列
  • 数据队列里面包含用户交互数据,或从文件中读取的数据
  • 可以使用await for或listen()来处理stream对象的数据
  • API提供异常捕捉—try-catch语句
  • 包含两个类型:单个订阅,广播Stream
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import 'dart:async';
import 'dart:async';
//返回一个迭代值的异步函数
Future<int> sumStream(Stream<int> stream) async {
var sum = 0;
//迭代-await for只能操作async函数
await for (var value in stream) {
sum += value;
}
return sum;
}
//返回【1...10】的异步队列 *代表更加安全可靠
Stream<int> countStream(int to) async* {
for (int i = 1; i <= to; i++) {
yield i;
}
}

main() async {
var stream = countStream(10);
var sum = await sumStream(stream);
print(sum); // 55
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import 'dart:async';
Future<int> lastPositive(Stream<int> stream) async {
var lastValue = null;
await for (var value in stream) {
//提取最后大于0的值
if (value < 0) continue;
lastValue = value;
}
return lastValue;
}

main() async {
var data = [1, -2, 3, -4, 5, -6, 7, -8, 9, -10];
var stream = new Stream.fromIterable(data);//将数组转换为Stream数据
var lastPos = await lastPositive(stream);//等待返回
print(lastPos); // 9
}

Thanks for your reading~