likes
comments
collection
share

Flutter异步02,Future、Event Queue、Microtask Queue

作者站长头像
站长
· 阅读数 11

前言

不废话(废话后面慢慢补充),先上Flutter中 什么代码丝会被立即执行、什么代码是被添加到Microtask Queue中执行、什么代码是被添加到Event Queue中执行的 总结

总结:

  // event Queue 👇
  Future(() => print("event1"));
  Future.delayed(
      Duration.zero,
      () => print(
          "event2")); //1.即使是0也会和直接执行有区别因为是被加到了event Queue里 2.时间代表至少要等time后加入到event Queue然后等待执行 3.谁先被加入谁就先执行
  //event Queue 👆

  //microtask 👇
  
   Future.error(Exception("something went error"))
    .then((value) => print('$value xxx'))
    .catchError((error) => print(error))
    .whenComplete(() => print("Complete")); //  符合Future.error() 和 和_completed.then()
      
  scheduleMicrotask(() => print("microtask1")); // 符合 scheduleMicrotask()
  Future.microtask(() => print("microtask2")); // 符合 Future.microtask()
  Future.value("123").then((value) => print(
      "microtask3")); //因为Future.value是立即完成的,符合_completed.then(),所以被加入到了microtask
  //microtask 👆

  print("main 1");
  //立即执行 👇
  Future.sync(() => print("sync 1")); // 符合 Future.sync()
  //不会放到Event Queue里,会立即执行
  Future.value(getName()); // 符合 Future.value()
  Future.delayed(Duration(seconds: 1), () => print('delayed'))
  .then((value) {
    scheduleMicrotask(() => print('Microtask'));
    print('then');
  })
  .then((value) => print('then2'));//这个delayed并不是立即执行。这里打印顺序delayed>then>then2>Microtask,想说明_.then()的内容先于Microtask执行
  print("main 2");
  //立即执行 👆
  
// 直接执行
flutter: main 1
flutter: sync 1
flutter: getName
flutter: main 2

// Microtask Queue
flutter: Exception: something went error
flutter: Complete
flutter: microtask1
flutter: microtask2
flutter: microtask3

// Event Queue
flutter: event1
flutter: event2
flutter: delayed
flutter: then
flutter: then2
flutter: Microtask

直接运行的代码

  1. Future.sync()
  2. Future.value()
  3. _.then() (Future完成的瞬间有then里的内容会马上执行)

例子:

  String getName() {
    print("getName");
    return "bob";
  }

  print("main 1");
  //立即执行 👇
  
  Future.sync(() => print("sync 1")); // 符合 Future.sync()
  //不会放到Event Queue里,会立即执行
  Future.value(getName()); // 符合 Future.value()
  
  //这个delayed并不是立即执行。这里打印顺序delayed>then>then2>Microtask,想说明_.then()的内容先于Microtask执行
  Future.delayed(Duration(seconds: 1), () => print('delayed'))
  .then((value) {
    scheduleMicrotask(() => print('Microtask'));
    print('then');
  })
  .then((value) => print('then2')); 
  
  print("main 2");
  //立即执行 👆
  
  // 最终打印
  // main 1
  // sync 1
  // getName
  // main 2
  // delayed
  // then
  // then2
  // Microtask
  

Event Queue

  1. Future()
  2. Future.delayed()
    1. 即使是0也会和直接执行有区别因为是被加到了event Queue里
    2. 时间代表至少要等time后加入到event Queue然后等待执行
    3. 谁先被加入谁就先执行

例子:

  //一个盒子 符合 Future()
  Future<String> getFuture() {
    return Future(() => "alice");
  }
  //一个延迟1s的盒子 符合 Future.delayed()
  ////1.即使是0也会和直接执行有区别因为是被加到了event Queue里 2.时间代表至少要等time后加入到event Queue然后等待执行 3.谁先被加入谁就先执行
  Future<String> getFuturrDelayed() {
    return Future.delayed(Duration(seconds: 0), () => "alice Delayed");
  }
  
  void _incrementCounter() {
    //then代表打开了这个盒子后
    //catchError 打开后发现问题
    getFuturrDelayed().then((value) => print(value));
    getFuture().then((value) => print(value)); 
    print("hi");
  }
  
  // 最终打印
  // hi
  // alice
  // alice Delayed
  
  void _incrementCounter() async {
    //then代表打开了这个盒子后
    //catchError 打开后发现问题
    var name = await getFuture();
    print("hi");
  }
  
  // 最终打印
  // alice
  // hi

await 代表先等待当前Future执行完毕后再继续执行下面的内容

Microtask Queue

  1. scheduleMicrotask()
  2. Future.microtask()
  3. _completed.then() (已经完成了的Future有then里的内容会优先执行)
  4. Future.error()
     Future.error(Exception("something went error")) //  抛出异常
    .then((value) => print('$value xxx')) // 非异常情况下的打印
    .catchError((error) => print(error)) // 捕获异常
    .whenComplete(() => print("Complete")); // 结束时 
    

例子:

  //microtask 👇

  // 符合Future.error()和_completed.then()
  Future.error(Exception("something went error"))
    .then((value) => print('$value xxx'))
    .catchError((error) => print(error))
    .whenComplete(() => print("Complete"));

  scheduleMicrotask(() => print("microtask1")); // 符合 scheduleMicrotask()
  Future.microtask(() => print("microtask2")); // 符合 Future.microtask()
  Future.value("123").then((value) => print(
      "microtask3")); //因为Future.value是立即完成的,符合_completed.then(),所以被加入到了microtask
  //microtask 👆
  
  // 最终打印
  //   something went error
  //   Complete
  //   microtask1
  //   microtask2
  //   microtask3