调用 Future 的函数也需要是 Future 吗?

Posted

技术标签:

【中文标题】调用 Future 的函数也需要是 Future 吗?【英文标题】:Does a function that calls a Future needs to be a Future too? 【发布时间】:2021-11-23 04:35:53 【问题描述】:

我有一个调用 Future 的函数。现在我不确定第一个函数是否也需要成为未来来等待数据。这是我的代码:

  FireBaseHandler handler = FireBaseHandler();

  saveRows() 
    handler.saveRows(plan.planId, plan.rows); ///this is a future
  

在我的 FireBaseHandler 类中,我有这个 Future:

  final CollectionReference usersCol =
      FirebaseFirestore.instance.collection('users');

  Future saveRows(String id, data) async 
    return await usersCol.doc(myUser.uid).collection('plans').doc(id)
        .update('rows': data);
  

那么第一个函数也需要是 Future 吗?

【问题讨论】:

【参考方案1】:

您可以在 sync 函数中包含 async 函数。但是这样你就失去了await 的能力。并且await 只允许在标记为async 的函数中使用,这导致我们作为该函数的结果到达Future。所以,是的,如果你需要等待结果,两个函数都必须是 Future 函数。

编辑: 如果你需要你的包装函数是sync,但仍然能够从内部async 函数中检索结果,你可以使用回调:

  saveRows(Function(dynamic) callback) 
    handler.saveRows(plan.planId, plan.rows).then((result)
      callback(result);
);
  

这样调用函数后的任何时间点都会检索到结果(代码不是awaited)

【讨论】:

以上是关于调用 Future 的函数也需要是 Future 吗?的主要内容,如果未能解决你的问题,请参考以下文章

java future函数的作用

多线程异步调用之Future模式

学习多线程中的 Future 模式一篇文章就够了 !!!

Flutter/Dart - 调用一个 Future<String> ...但只需要返回一个 String 的函数

强大的CompletableFuture

多线程(10) — Future模式