gpt4 book ai didi

asynchronous - 关于Dart async/await。我使用一段代码进行测试,但是打印结果与预期不符

转载 作者:行者123 更新时间:2023-12-03 04:15:21 25 4
gpt4 key购买 nike

void main() {
methodA();
methodB();
methodC('main');
methodD();
}

methodA(){
print('A');
}

methodB() async {
print('B start');
await methodC('B');
print('B end');
}

methodC(String from) async {
print('C start from $from');
Future((){
print('C running Future from $from');
}).then((_){
print('C end of Future from $from');
});
print('C end from $from');
}

methodD(){
print('D');
}


打印结果如下:
A
B start
C start from B
C end from B
C start from main
C end from main
D
B end
C running Future from B
C end of Future from B
C running Future from main
C end of Future from main

我不明白的是为什么 C start from mainC end from mainB end之前打印?
这就是为什么尚未执行 print('B end'),而已执行 methodC('main')的原因。
我以为我了解 async/await,但是直到遇到这段代码。我希望能得到帮助

最佳答案

发生的是:

  • 运行时系统调用main
  • main调用methodA
  • methodA打印“A”
  • methodA返回。
  • main调用methodB
  • methodB打印“B开始”
  • methodB调用methodC("B")
  • methodC打印“C从B开始”
  • methodC使用Future构造函数创建一个 future f1。这调度了计时器t1。
  • methodC在f1上调用then,这会在f1上添加一个侦听器并返回将来的g1。 (这个 future 将被忽略)。
  • methodC打印“C从B结束”
  • methodC,因为它是async,所以返回future h1,并计划一个微任务m1以null完成该future。
  • methodB等待h1。
  • methodB,因为它是异步的,所以返回将来的k。 (这个 future 将被忽略)。
  • main调用methodC("main")
  • methodC打印“C从主开始”
  • methodC使用Future构造函数创建了一个 future f2。这安排了计时器t2。
  • methodC在f2上调用then,这会在f2上添加一个侦听器并返回将来的g2。这个 future 被忽略了。
  • methodC打印“主端C结束”
  • methodC,因为它是async,所以返回一个将来h2,并计划一个微任务m2以null完成该将来。 ( future 被忽略)。
  • main调用methodD
  • methodD打印“D”
  • methodD返回。
  • main返回。
  • 微任务循环运行微任务m1,该函数以空值结束将来的h1。
  • methodB完成了其await表达式,因为h1已完成。
  • methodB打印“B结束”
  • methodBnull完成将来的k。没有人在听那个。
  • 微任务循环运行微任务m2,该任务将以空值结束将来的h2。没有人在听那个。
  • 现在,微任务队列为空。
  • 事件循环运行计时器t1,该计时器
  • 打印“C从B运行 future ”
  • 使用null完成f1的 future 。
  • 在f1和上调用then侦听器。
  • 打印“B的C末日结束”
  • 以`null'完成g1的 future 。没有人在听。
  • 事件循环运行计时器t2,该计时器
  • 打印“C从主运行 future ”
  • 使用null完成f1的 future 。
  • 在f1和上调用then侦听器。
  • 打印“从主开始的C结束端”
  • 以`null'完成g1的 future 。没有人在听。
  • 事件和微任务队列现在为空,程序退出。
  • 关于asynchronous - 关于Dart async/await。我使用一段代码进行测试,但是打印结果与预期不符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59389183/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com