认识 Dart 异步编程 async/await 关键字(二)


async/await

在中,我们初步认识了 Dart 异步编程,以及代表异步操作结果的Future对象。

如果异步任务过多,超过三个以上,在代码层面上,造成多层“倒三角”,使阅读性大大降低。

getHobbies() {
	post('http://api.example.com/get/user/${userId}').then((user) {
		post('http://api.example.com/get/tags/${user.id}').then((tags) {
			post('http://api.example.com/get/hobbies/${user.id}').then((hobbies) {
				print(hobbies);
			});
		});
	});
}

async/await关键可以解决上诉“倒三角”现象,并使代码的阅读性大大提高,也利于代码的书写。

getHobbies() async {
	User user = await post('http://api.example.com/get/user/${userId}');
	Tags tags await post('http://api.example.com/get/tags/${user.id}');
	Hobbies hobbies = await post('http://api.example.com/get/hobbies/${user.id}');
	print(hobbies);
}

async用于函数,在函数小阔号后面添加代表此函数是一个异步函数。await用在阻塞任务前,例如,获取用户是一个网络请求,且此任务会发生一个等待,那么在前面添加上await关键字即可。

实际操作

写一个让线程休眠 10 秒钟的函数。

Future waitFuture() {
  return Future(() {
    sleep(Duration(seconds: 10));
  });
}

Future(FutureOr computation()),当中的 computation 等待异步任务执行完成,假若异步任务出现异常,将返回一个携带错误的 Future 对象。

执行waitFuture

void main() {
  waitFuture().then((value) {
    print('completed.');
  });
}

10 秒之后,completed 被打印到控制台,成功完成了异步任务。

现在,使用async/await简化上面的操作:

void main() async {
  await waitFuture();
  print('completed.');
}

等待waitFuture任务完成之后,才会进行下一步任务,10 秒之后,complete 才会被打印到控制台。