【问题标题】:Why does the calling function need to return a 'future'?为什么调用函数需要返回一个“未来”?
【发布时间】:2021-01-23 03:59:39
【问题描述】:

我对 Dart 还很陌生,我一直在试图理解为什么调用函数需要返回一个未来?我明白为什么被调用函数需要返回未来,而不是调用函数本身。这似乎没有意义并且混淆了逻辑。例如,假设我想要:

List<String> someFunct() async {
   final _res = await someFuture();
   return _res.toList();
}

如果不将调用函数的返回值包装在 Future 中,然后将这个异步模型传播到调用树上,我就无法做到这一点。调用函数不是未来,因此它不需要返回未来。

【问题讨论】:

  • 在您的示例中,someFunc 直到 someFuture 完成后才能将值返回给它的调用者。由于someFunc 必须等待,someFunc 的调用者也必须等待。也许你认为someFunc 可以block 直到someFuture 完成,但 Dart 在每个隔离中都是单线程的。如果someFunc 被阻止,那么someFuture 将永远无法解决。也许你认为someFunc 可以阻止并允许someFuture 通过旋转它自己的事件循环来解决,但现在你会有嵌套的事件循环,这通常是坏消息(例如,它们可能导致意外的重新进入) .

标签: dart async-await


【解决方案1】:

异步函数是在被调用时不会立即完成其工作的函数。这就是它返回Future 的原因,这是一个最终将提供结果的对象。

所有函数在被调用时都必须返回一些东西。 Dart 不支持 阻塞,其中一个函数只是在中间停止并让其他代码运行直到它准备好继续,因为这需要有单独的堆栈,并且它不能有效地编译为 JavaScript。所以异步函数必须立即返回一些东西,而那个东西就是未来。

返回未来允许调用函数等待结果可用。如果需要使用结果,它必须这样做。

在您的示例中,someFunct 想要返回一个直到稍后才可用的列表。它不能简单地立即返回一个列表,因为它还没有这个列表。所以,它必须返回一个Future&lt;List&lt;String&gt;&gt;。

您不需要从其他异步函数返回未来的一种情况是调用函数不关心结果,或者它以其他方式获取结果,比如将其添加到准备好后的集合。然后你可以直接返回void,不用担心未来。

在绝大多数情况下,您的异步函数必须返回一个未来,因为它们想要返回一些东西,而这就是它们在真正的结果准备好之前所拥有的一切。

【讨论】:

  • 谢谢。这是有道理的。
  • @Irn 你能详细说明一下当它准备好时将它添加到集合中?我不明白您对将结果添加到集合的引用。你是在说一些全球性的收藏吗?
  • 是的。我实际上只是在谈论 any 将结果值从程序中的一个位置流向另一个位置的其他方式,而不是返回它。将其放入全局集合中,或者放入与调用一起传递的集合中,或者调用一些全局函数来注册结果,这些只是您可以做到这一点的一些方法。调用者函数也可以传递一个回调函数(但它确实应该返回一个 Future 或 Stream (在强制转换中回调将被多次调用),因为这是在异步中执行回调的规范方式代码)。
猜你喜欢
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 2018-05-17
  • 2015-09-28
相关资源
最近更新 更多