Dart:当两个或多个任务等待同一个 Future 时会发生什么

2024-04-30

在 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);
}

没有保证回调按照添加的顺序被调用。

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

触发这些情况并不容易,时机必须恰到好处,但这是可能的。

在此示例中,有 3 个等待f1未来。它是最有可能的打印的值将是2(因为没有什么奇特的事情发生),但是两者3 and 0是允许的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart:当两个或多个任务等待同一个 Future 时会发生什么 的相关文章

随机推荐

  • 如何将多个先前声明解析为带有 extern 的新声明?

    第三个应该是什么x参考 include
  • Asp.Net SQL更新语句

    我有一个Asp net在我的页面上的应用程序中 用户请求删除用户 然后 这将填充我的 Admin TaskList 数据库 然后 管理员进入站点的安全区域并输入用户名并单击按钮 确认后 该用户将从我的 用户 数据库中删除 已经可以正常工作
  • 如何在闪亮的应用程序中垂直居中操作按钮?

    我有两个按钮在我的列中水平居中 但无法弄清楚如何垂直居中 我尝试使用 垂直对齐中间 下面是我的用户界面代码 ui lt shinyUI fluidPage tags style HTML buttons background color y
  • 解决源自 .lib 文件的“本地定义的符号”和“未解析的外部符号”

    我正在尝试在 Windows 7 64 位上的 Visual C 2010 上使用开源库 GDCM 编译我的项目 我已在我的项目中包含了所需的 lib 文件 gdcmDSED lib 和 gdcmMSFF lib 但是 编译器抱怨超过 10
  • 在全屏应用程序前面添加 NSWindow

    我想在所有其他应用程序前面有一个窗口 我希望此窗口出现在 Alfred 应用程序等关键字快捷方式上 我尝试了很多解决方案 但对于在主屏幕或第二屏幕上的全屏应用程序前面放置 NSWindow 没有任何作用 我尝试了经典 self window
  • 如何通过电子邮件发送保存的 CSV 文件或在 Android 中使用 Google Drive 上传?

    我有一个简单的日志记录应用程序 它将数据收集到三个数组列表中 我想将其保存到 CSV 文件中 然后共享到 Google Drive 电子邮件等 这是我保存数据的方法 StringBuilder data new StringBuilder
  • 无法在 Spring boot 中使用 @Valid 验证请求正文

    我想验证我的请求正文 Valid注解 但在 Spring Boot 中不起作用 我在 JAR 文件中有一个 Request 类 无法使用两个字段进行修改 其中一个字段的类型为对象 我的控制器类接受此类对象作为请求主体 当我将下面的 JSON
  • Lisp 格式和强制输出

    我不明白为什么这段代码在不同的实现中表现不同 format t asdf setq var read 在 CLISP 中 它的行为与预期一致 先打印提示 然后读取 但在 SBCL 中 它显示 then输出 我在网上查了一下 修改了一下 fo
  • 为什么循环比循环体多执行一次?

    摘自算法教科书的一段话 当 for 或 while 循环以通常的方式退出时 即 由于循环头中的测试 测试的执行次数比循环体多执行一次 因此 例如 一个 for 循环以for j 1 to 3会被执行不是3次 而是4次 问题 为什么这样的循环
  • 通过 SqlConnection/SqlCeConnection 连接到 .sdf 数据库时出现问题

    我在连接到 sdf sql 紧凑版 数据库时遇到了巨大的麻烦 我可以最初连接以提取行以验证用户名 密码 但是当我尝试通过 SqlCeConnection SqlCeCommand 命令或尝试添加项目 SqlClient SqlCommand
  • 教程在 SaveContext 中抛出上下文未定义错误

    这可能是一个新手问题 但我正在使用react admin Tutorial html 当涉及到使用EditGuesser时 编辑 页面失败 报告 TypeError 上下文未定义 AFAIK 我已按照说明进行操作 在 添加创建和编辑功能 部
  • ASP.NET 5 OAuth 重定向 URI 不使用 HTTPS

    我正在复制社会样本 https github com aspnet Security tree 1 0 0 beta4 samples SocialSample但尝试使用此处未显示的不同 OAuth 提供程序 所以我有一些如下代码 app
  • PHP Guzzle 具有基本身份验证和不记名令牌

    我正在尝试与 infojobs api 建立连接 文档解释了如何以这种方式进行连接 获取 api 1 应用程序 HTTP 1 1主办 api infojobs net 授权 基本QWxhZGRpbjpvcGVuIHNlc2FtZQ 承载07
  • 检查 Javascript 中的 URL 是否损坏

    这个问题之前已经发布在 Stack 上 但没有一个具体到我想要理解的内容 检查 URL 是否正确的最简单方法是发送 http Head 请求 但是如何使用它来指定 URL 呢 我在之前的帖子中发现了这一点 function UrlExist
  • Objective-C 中的非正式协议?

    我想知道是否有人可以解释一下 Objective C 中的非正式协议是什么 我尝试在苹果文档和其他一些书籍上理解它 但我的头仍然在旋转 所以如果有人可以用例子解释 我将非常感激 Thanks An 非正式协议正如乔纳森所说 通常是在 NSO
  • Matlab 中二维插值的函数形式

    我需要从二维数据数组构造一个插值函数 我需要返回实际函数的东西的原因是 我需要能够将函数作为我需要进行数值积分的表达式的一部分进行计算 因此 interp2 并没有解决这个问题 它不返回函数 我可以使用 TriScatteredInterp
  • stdClass 到数组?

    i have stdClass Object 0 gt stdClass Object one gt aaa two gt sss 1 gt stdClass Object one gt ddd two gt fff 2 gt stdCla
  • 如何从 TextInputLayout 中删除底部填充

    第一张图就是我想要的 第二张图是我实现的 正如您所看到的 TextInputLayout 的底部有一个填充 这使得灰色背景溢出超过 edittext 行 请不要建议负边距或填充 因为它在较新的 API 中不起作用 这是我为第一个文本输入布局
  • 插入排序 C#

    你们能帮我完成 C 中的基本插入排序吗 我有一个数组中的姓名和居住城市列表 需要通过比较居住城市来对该数组进行排序 列表必须按字母顺序排序 比较器已经设置完毕并可以工作 我只是对插入排序器编程有点迷失 因为这是我们第一次使用这种排序方法 到
  • Dart:当两个或多个任务等待同一个 Future 时会发生什么

    在 Dart 中 当两个或多个任务等待同一个 Future 时 当 Future 完成时 任务是否按照执行等待的顺序获得通知 运行 即第一个执行等待的任务是第一个运行的 这段代码保证输出2 int res 0 Future