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?