Dart 入门教程(五),同步和异步

这是 Dart 入门教程最后一篇,主要分享 async 和 await 关键词以及 Future 类来处理异步编程。我这里直接提供两个例子来学习他们的使用。

  main(List<String> args) {
    print("main function start");

    Future.delayed(Duration(seconds: 3), () {
      return "3秒后的信息";
    }).then((value) {
      print(value);
    });

    print("main function end");
  }

上面的程序运行后,将看到以下输出

main function start
main function end
(3秒钟后...)
3秒后的信息

为什么会这样执行,这里涉及到 Future 的两个 API 。 Future.delayed,传入一个 Duration 对象,表示延迟时间为 3 秒。这意味着在 3 秒后,传入的回调函数(() { return "3秒后的信息"; })将被执行。

接着使用 then 方法,在 Future.delayed 完成后执行一个回调。另外,main 函数会在等待 Future.delayed 的过程中继续执行。所以会先执行出:

main function start
main function end

为什么会这样呢,为什么 Future 的代码明明在前面,结果最后执行。

和 JAVA 另开线程启动异步任务不一样,Dart 使用单线程事件循环模型来处理异步操作,在 Dart 中,Future 对象用于在事件循环中表示未来会完成的某个操作的结果。再通俗点说,我们可以将耗时操作放到 Future 任务中。接着再来学习 async 和 await 关键字。还是上面的案例,修改成如下:

  Future<String> delayedMessage() async {
    return Future.delayed(Duration(seconds: 3), () {
      return "3秒后的信息";
    });
  }

  void main() async {
    print("main function start");

    String message = await delayedMessage();
    print(message);

    print("main function end");
  }

上述代码执行后,打印结果

main function start
(3秒钟后...)
3秒后的信息
main function end

为什么这个类执行结果顺序和上面不一样呢?就是关键词 await 和 async 的使用。main 函数中,使用 await 关键字等待 delayedMessage() 的结果。await 会暂停当前函数的执行,直到等待的异步操作完成。

有两个“定理”,await 关键字必须在一个用 async 标记的函数内部使用,也就是方法内用了 await ,这个方法函数必须用 async 修饰。其次, 如果一个方法用 asnyc 修饰标记,这个函数应该返回一个 Future 类型。像下面这个方法:

  Future<String> delayedMessage() async {
    return Future.delayed(Duration(seconds: 3), () {
      return "3秒后的信息";
    });
  }

OK,以上就是我要分享的,也是 Dart 入门教程最后一篇。

Dart 入门教程(一),变量、集合篇

Dart 入门教程(二),函数篇

Dart 入门教程(三),运算符篇

Dart 入门教程(四),类的使用

本文由老郭种树原创,转载请注明:https://guozh.net/dart-getting-started-tutorial-await-and-async/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注