在DART中,当两个或多个任务在同一个Future上等待时,当Future完成时,任务是否按照它们执行等待的顺序得到通知/运行,即第一个执行等待的任务是第一个运行的.

此代码是否保证输出为2

int res = 0;

Future<void> foo1 () async
{
  await Future.delayed(Duration(seconds: 2));
  res = 2;
}


void main() async
{
  await foo1();
  print(res);
}

那么这段代码又是怎么回事呢?

int res = 0;

Future<void> foo1 () async
{
  await Future.delayed(Duration(seconds: 2));
}


Future<void> foo2 (Future<void> f1) async
{
  await f1;
  res = 2;
}

Future<void> foo3 (Future<void> f1) async
{
  await f1;
  res = 3;
}


void main() async
{
  res = 0;
  
  Future<void> f1 = foo1();
  foo3(f1);
  foo2(f1);
  await f1;
  print(res);
}

推荐答案

no guarantee个回调按照它们被添加的顺序被调用.

按该顺序调用回调的dart:async库代码tries,但这只是尽力.在某些情况下,通常在将来完成之前添加一个回调,而在将来完成之后添加另一个回调,可能会以不同的顺序调用,因为它们由不同的代码路径处理.

触发这些案件并不容易,时机必须恰到好处,但这是可能的.

在这里的例子中,有三个关于f1future 的等待.它是most likely,打印值将是2(因为没有什么奇特的事情发生),但30都是允许的结果.

Dart相关问答推荐

NetworkImage 正在缓存旧图像

Flutter Expansion Tile -- 标题 colored颜色 变化和尾随动画箭头 colored颜色 变化

可调用云函数错误:响应缺少数据字段

如何在 Dart 中创建画布元素?

Flutter中包导入和普通导入有什么区别?

自定义声音推送通知不起作用

Flutter 扩展方法不起作用,它说undefined class和requires the extension-methods language feature

在Flatter中滚动列表视图时,网络图像一直消失?

Flutter:如何检测键盘按键?

如何在Flatter中的press/finger/mouse/cursor位置显示菜单

如何在Flutter中正确显示Snackbar?

Flutter:测试期间的计时器问题

将函数/方法分配给 Dart 中的变量

如何判断switch/case中对象的类型?

扩展一个只有一个工厂构造函数的类

对象的默认stringify,相当于Java的toString?

如何在 Dart 中逐个字符地迭代字符串?

如何在 base64 中编码 Dart 字符串?

Dart:创建一个从 0 到 N 的列表

const 构造函数实际上是如何工作的?