Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么dart允许将来不返回异步?_Dart_Asynchronous_Async Await - Fatal编程技术网

为什么dart允许将来不返回异步?

为什么dart允许将来不返回异步?,dart,asynchronous,async-await,Dart,Asynchronous,Async Await,这几乎就像我可以写一个async,通过指定它为,比如说,voidnotFuture void fetchUserOrder()异步{ //假设此函数正在从另一个服务或数据库获取用户信息。 等待未来。延迟(持续时间(秒:2)); 印刷品(“大杯拿铁”); 打印(‘大杯拿铁咖啡后’); } void main()异步{ fetchUserOrder(); 等待未来。延迟(持续时间(秒:1)); 打印('获取用户订单…'); 打印('获取用户订单后…'); } 打印: Fetching user o

这几乎就像我可以写一个
async
,通过指定它为,比如说,
void
not
Future

void fetchUserOrder()异步{
//假设此函数正在从另一个服务或数据库获取用户信息。
等待未来。延迟(持续时间(秒:2));
印刷品(“大杯拿铁”);
打印(‘大杯拿铁咖啡后’);
}
void main()异步{
fetchUserOrder();
等待未来。延迟(持续时间(秒:1));
打印('获取用户订单…');
打印('获取用户订单后…');
}
打印:

Fetching user order...
After Fetching user order...
Large Latte
After Large Latte
这在
.NET
c++20
领域是sooo所以不允许的

  • 我想知道为什么
    dart
    async
    函数返回非
    Future
  • 难道这不会导致API中到处都是预期的隐藏
    异步的

    • Dart不会强迫你等待未来。期货在
      await
      推出之前就存在了,所以它实际上不可能存在。 这意味着你永远不能等待未来。有一些lint使其更难避免,但没有什么可以阻止您仅定义
      ignore(Object?){}
      并执行
      ignore(futurecooperation())

      由于
      未来
      是一个对象,因此可以将
      未来
      分配给
      对象
      ,也可以将
      对象
      分配给任何对象,包括
      无效
      。这也意味着异步函数可以转换为返回类型为
      void
      的函数类型,如:

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

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

      void日志(字符串消息)异步{
      (等待getLogger()).log(消息);
      }
      
      此函数将(最终)记录消息,但您不必等待它这样做

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

      void日志(字符串消息){
      getLogger()。然后((记录器){
      logger.log(消息);
      });
      }
      

      (这不完全相同,因为
      async
      版本目前确实返回未来,它只是告诉您不要使用它,而是将其键入
      void
      。即使您确实不应该,您也可以将
      void
      强制转换为
      return to
      dynamic
      等待它。非
      async
      版本不会返回未来。)(根本不是未来。)

      快速评论:dart不允许任何非未来,它明确允许
      无效
      作为唯一的非
      未来
      @nvoigt。我是dart的新员工。感谢您的澄清。如果您知道/怀疑设计决策背后的原因,也请发布一些答案。一旦您意识到这只是
      无效
      ,您也会意识到hat
      .NET
      与允许
      异步void
      完全是同一条船。Dart不是唯一的例子。@Damien\u不信者啊。这很有道理!任务调度不允许在外面等待。如果你想要一个lint(并因此发出警告)关于缺少
      Future
      作为
      async
      标记方法中的返回值,您可以将
      avoid\u async
      添加到分析器中。lint记录在这里:您是否也可以在调用
      Future
      偏好(未指定
      async
      的情况下)的等效版本中写入
      log(String message)
      ?“施放
      void
      return”:哎呀!他们到底为什么会允许这样做!!太奇怪了!感谢直接链接版本。