前言
不废话(废话后面慢慢补充),先上Flutter中 什么代码丝会被立即执行、什么代码是被添加到Microtask Queue中执行、什么代码是被添加到Event Queue中执行的 总结
总结:
scss
// 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");
//立即执行 👆
vbnet
// 直接执行
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
直接运行的代码
- Future.sync()
- Future.value()
- _.then() (Future完成的瞬间有then里的内容会马上执行)
例子:
scss
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
- Future()
- Future.delayed()
- 即使是0也会和直接执行有区别因为是被加到了event Queue里
- 时间代表至少要等time后加入到event Queue然后等待执行
- 谁先被加入谁就先执行
例子:
scss
//一个盒子 符合 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
-
scheduleMicrotask()
-
Future.microtask()
-
_completed.then() (已经完成了的Future有then里的内容会优先执行)
-
Future.error()
scssFuture.error(Exception("something went error")) // 抛出异常 .then((value) => print('$value xxx')) // 非异常情况下的打印 .catchError((error) => print(error)) // 捕获异常 .whenComplete(() => print("Complete")); // 结束时
例子:
scss
//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