【问题标题】:Why do dart allow non-Future returning async?为什么飞镖允许非未来返回异步?
【发布时间】:2021-05-14 18:33:28
【问题描述】:

这几乎就像是我可以写一个async,将其指定为void 而不是@ 987654325@

void fetchUserOrder() async {
  // Imagine that this function is fetching user info from another service or database.
  await Future.delayed(Duration(seconds: 2));
  print('Large Latte');
  print('After Large Latte');
}

void main() async {
  fetchUserOrder();
  await Future.delayed(Duration(seconds: 1));
  print('Fetching user order...');
  print('After Fetching user order...');
}

打印:

Fetching user order...
After Fetching user order...
Large Latte
After Large Latte

这是 sooo 所以在.NETc++20 领域中不允许

  • 我想知道为什么dartasync 函数返回非Future
  • 这会不会以有意在 API 中到处隐藏 async 告终?

【问题讨论】:

  • 快速评论:dart 不允许 any non-Future,它明确允许 void 作为 only non-Future
  • @nvoigt 我是 dart 的新手。谢谢你澄清。如果您知道/怀疑该设计决定背后的原因,也请发布一些答案。
  • 一旦您意识到它只是void,您也会意识到.NET 与允许async void 完全一样。 Dart 并不是唯一的例子。
  • @Damien_The_Unbeliever 啊。这很有道理!任务调度应不允许在外面等待。
  • 如果你想要一个关于缺少Future<void> 作为async 标记方法中的返回值的lint(因此是一个警告),你可以将avoid_void_async 添加到分析器中。 lint 记录在这里:dart-lang.github.io/linter/lints/avoid_void_async.html

标签: dart asynchronous async-await


【解决方案1】:

Dart 不会强迫您等待期货。期货在await 被引入之前就已经存在,所以它不可能。 这意味着您可以始终等待未来。有一些 lints 很难避免,但没有什么能阻止您只定义 ignore(Object? _){} 并执行 ignore(futureOperation());

由于Future 是一个对象,您可以将Future 分配给Object 以及您可以分配Object 的任何对象,包括void。这也意味着可以将异步函数强制转换为返回类型为void 的函数类型,例如:

void Function() f = () async { .... };

您可以调用它并忽略结果。 这也是为什么您可以将async 方法的返回类型声明为voiddynamicObject?。因为类型系统无论如何都必须允许它。 如果Future 不是Object 的子类型,情况会有所不同,但这也会使很多事情变得更加复杂。

可以故意使用。如果您确实确实想要一个在后台执行异步操作的函数,但又不想让任何人等待它们,您可以这样做:

void log(String message) async {
  (await getLogger()).log(message);
}

此函数将(最终)记录消息,但您不必等待它这样做。

您也可以在不使用async 的情况下编写基本相同的函数,因此使用async 强制禁止void 返回类型只是一个不必要的障碍,迫使您以可读性较差的方式重写相同的东西。

void log(String message) {
  getLogger().then((logger) {
    logger.log(message);
  });
}

(这不完全相同,因为async 版本当前确实返回一个未来,它只是告诉你不要使用它,而是将它输入为void。你可以,即使你真的不应该,将void 转换为dynamicawait 无论如何。非async 版本不会返回未来全部。)

【讨论】:

  • 能否请您也将log(String message) 写成与Future<> 支持的等效版本(未指定async)?
  • "cast the void return": 哎呀! 到底为什么他们会允许这样做!好诡异!感谢直接链​​接版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2020-11-28
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 2021-04-01
相关资源
最近更新 更多