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

为何Dart的async方法中await未生效?两段代码差异解析

为何await在async方法中未生效?

第一段代码(await未生效)

Future<void> f1() async{
  Future.delayed(Duration(seconds:2), (){
    print('f1');
  });
}

void main() async{
  print('start');
  await f1();
  print('end');
}

输出:

start
end
f1

第二段代码(await正常生效)

Future<void> f1() async{
  return Future.delayed(Duration(seconds:2), (){
    print('f1');
  });
}

void main() async{
  print('start');
  await f1();
  print('end');
}

输出:

start
f1
end

差异原因

核心在于async函数内部创建的Future是否被关联到函数返回的Future上:

  • 第一段代码中,f1作为async函数会自动生成并返回一个空的Future,但函数体里只是创建了Future.delayed却没有对它做任何处理——既没有用await等待它完成,也没有把它作为返回值。这意味着f1的同步代码执行完(也就是创建完Future.delayed对象)后,它返回的Future就立刻完成了。所以main里的await f1()只会等待f1的同步逻辑结束,不会等内部的Future.delayed,于是直接打印end,而Future.delayed会在后台继续执行,2秒后才打印f1。
  • 第二段代码中,f1把Future.delayed作为返回值返回了。此时async函数生成的返回Future会和这个返回的Future.delayed绑定,await f1()实际上是在等待这个Future.delayed完成。只有当2秒后Future.delayed执行完、打印f1之后,f1返回的Future才会完成,main才会继续执行print('end')。

额外补充:如果不想返回这个Future,也可以在f1内部用await Future.delayed(...),效果和返回它完全一致——async函数会等待内部的await操作完成后,才会让自己的返回Future结束。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:48:29