为什么dart允许将来不返回异步?
这几乎就像我可以写一个为什么dart允许将来不返回异步?,dart,asynchronous,async-await,Dart,Asynchronous,Async Await,这几乎就像我可以写一个async,通过指定它为,比如说,voidnotFuture void fetchUserOrder()异步{ //假设此函数正在从另一个服务或数据库获取用户信息。 等待未来。延迟(持续时间(秒:2)); 印刷品(“大杯拿铁”); 打印(‘大杯拿铁咖啡后’); } void main()异步{ fetchUserOrder(); 等待未来。延迟(持续时间(秒:1)); 打印('获取用户订单…'); 打印('获取用户订单后…'); } 打印: Fetching user o
async
,通过指定它为,比如说,void
notFuture
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 todynamic
并等待它。非async
版本不会返回未来。)(根本不是未来。)快速评论:dart不允许任何非未来,它明确允许无效
作为唯一的非未来
@nvoigt。我是dart的新员工。感谢您的澄清。如果您知道/怀疑设计决策背后的原因,也请发布一些答案。一旦您意识到这只是无效
,您也会意识到hat.NET
与允许异步void
完全是同一条船。Dart不是唯一的例子。@Damien\u不信者啊。这很有道理!任务调度不允许在外面等待。如果你想要一个lint(并因此发出警告)关于缺少Future
作为async
标记方法中的返回值,您可以将avoid\u async
添加到分析器中。lint记录在这里:您是否也可以在调用Future
偏好(未指定async
的情况下)的等效版本中写入log(String message)
?“施放void
return”:哎呀!他们到底为什么会允许这样做!!太奇怪了!感谢直接链接版本。