You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中Future.delayed参数执行时机差异问题咨询

结论

你的判断完全正确,第二段代码中f()确实是立即执行的,并非延迟3秒触发。

核心原理说明

  • 首先明确Future.delayed的参数规则:Future.delayed的第二个可选参数是可调用的函数对象(类型为FutureOr<T> Function()),只有当你传入函数本身的引用时,才会在延迟时长结束后自动调用该函数。如果传入的是函数执行后的返回值,该参数会被直接忽略,延迟结束后不会触发任何回调执行。
  • 异步函数的执行规则:Dart中async标记的函数,在遇到await关键字之前,所有代码都是同步执行的,不会让出事件循环的控制权。

两段代码的执行流程差异

第一段代码执行流程

  1. 实例化A类对象a,初始str值为A
  2. 调用transform(a),同步执行到await Future.delayed(...)这一行:
    • 传入的第二个参数是匿名函数() => a.str = 'B'的引用,没有执行,仅作为回调注册
    • 遇到await,暂停transform执行,控制权交回main函数
  3. main函数执行print(a.str + ' sync'),此时a.str还是A,输出A sync
  4. 3秒延迟结束,触发回调执行,a.str被修改为B,后续输出B async

第二段代码执行流程

  1. 实例化A类对象a,初始str值为A
  2. 调用transform(a),同步执行到await Future.delayed(...)这一行:
    • 解析第二个参数时,f()带括号属于函数调用语法,会立即执行f函数,a.str被同步修改为B,将f的返回值(null)传给Future.delayed
    • 遇到await,暂停transform执行,控制权交回main函数
  3. main函数执行print(a.str + ' sync'),此时a.str已经是B,输出B sync
  4. 3秒延迟结束,Future.delayed完成,恢复transform执行,输出B async

内容的提问来源于stack exchange,提问作者ArtT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:24:03