18.异步编程之Future
代码执行顺序
下面一段代码的执行顺序是很明显的
int number = 1;
void main() {
print('${DateTime.now()} start: $number');
doSomeThing();
print('${DateTime.now()} end: $number');
}
doSomeThing() {
for(int i = 0; i < 1000000000; i++) {
number += 1;
}
print('${DateTime.now()} $number');
}顺序输出没有什么问题
async
加上 async 呢?是不是就变成异步的了?
并没有什么变化,依然按顺序同步执行。
Future
在上文16.第三方库导入与网络数据异步请求与展示中我们的有用到 Future 进行异步网络请求。这里我们模拟网络请求,将耗时操作进行包装:
通过打印我们发现这里的确是异步执行的:
Future是什么
通过查看源码我们能够发现。它是一个工厂构造函数。
async - await
思考一下,下面代码的执行顺序会是什么样呢?
这里进行一下简单的分析:
在
doSomeThing内Future是异步执行的但
Future加了await,那么在当前作用域中,后面的代码就会被阻塞。即
print('doSomeThing结束');这段代码会等待Future内的任务完成才执行。
main 函数内
三行代码执行是按顺序执行的,不会受
doSomeThing内部的 await 的影响
按照预期输出应为:
start
end
print('${DateTime.now()} $number');doSomeThing结束
执行验证✅
async 和 await 是成对出现的。你也可以试试只写 await,看看是什么效果。
then 与任务的返回值
对 Future 有所了解的话,知道通过 then 我们可以在任务完成的时候进行一些操作。下面对代码嫂做修改:
输出:
这里 then 回调里的 value 是空的,该怎样为 value 赋值呢?很简单,直接在 Future 的任务中 return 就可以了
这里再次修改代码:
输出验证✅
符合预期。
Last updated
Was this helpful?