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

这是 Dart 入门教程最后一篇,主要分享 asyncawait 关键词以及 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 任务中。接着再来学习 asyncawait 关键字。还是上面的案例,修改成如下:

  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

为什么这个类执行结果顺序和上面不一样呢?就是关键词 awaitasync 的使用。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/

发表回复

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