【问题标题】:Questions about Future in Dart关于 Dart 未来的问题
【发布时间】:2019-12-09 13:05:28
【问题描述】:

异步编程教程here 讨论了async await,但避免讨论Future API。我可以找到有关Future API here 的更多信息,但我仍有一些问题。这些教程让我提出了一些问题,理想情况下我应该为每个问题放置一个,但由于它们很小且相关,我更喜欢在一个地方提出所有问题。

  1. 什么触发/启动Future 执行?

    从文本中我只能得出结论,一旦async 方法返回,Future 将立即被运行时触发。

  2. Future.wait()Future.then().then().then() 有什么区别?

  3. return await myFuture;return myFuture 是否相同?

    文中说async 方法一旦看到awaitreturn,就会返回不完整的Future

  4. 文字说:

重要提示:异步函数返回 Futures。如果您不希望您的函数返回未来,请使用不同的解决方案。例如,您可能会从您的函数中调用异步函数。

我们如何调用async 函数,得到它的返回值,而不是await,因此,不是async 函数?

【问题讨论】:

    标签: asynchronous dart future


    【解决方案1】:

    什么触发/启动 Future 执行?

    1. Future 的代码块被放置到事件队列中,因此当轮到它进入事件队列时它会被执行。 Flutter in Focus Futures 视频很好地展示了它的工作原理。

    Future.wait() 和 Future.then().then().then() 有什么区别?

    1. 它们是处理多个期货的不同方式,但差异很微妙。 Future.wait 处理错误的方式略有不同,其值作为列表返回,而不是在顺序代码块中,但实际上,对于您的情况,差异可能无关紧要。

    return await myFuture;return myFuture 是否相同?

    1. 没有。在第一种情况下,在等待时暂停执行,直到在事件队列中处理 Future。在第二种情况下,Future 本身返回给调用者,并按照调用者的意愿继续执行(可能直到Future 有机会被处理)。

      await 是一种语言功能,它本质上是等待 Future 完成,而 return 只是将 Future 本身返回给调用者。

    我们如何调用async函数,得到它的返回值,而不是await,因此,不是async函数?

    1. 如果您需要返回值,那么您可以调用async 函数,然后直接使用Future 而不是使用await。这是一个愚蠢的例子:
    Future<int> getAsyncInt() async {
      return 0;
    }
    
    void testAsync() {
      getAsyncInt().then((value) {
        print("Got an async int: $value");
      });
    }
    

    在上面的例子中,你可以看到我们使用了一个异步函数,但是testAsync 并没有等待这个值(而是使用了一个Future,所以最终的结果是一样的)。

    如果你不需要返回值,你可以直接调用async函数:

    Future<int> getAsyncInt() async {
      return 0;
    }
    
    void testAsync() {
      getAsyncInt();
    }
    

    在第二种情况下,事实上,getAsyncInt() 确实会被调用,即使它的返回值被调用者忽略了。

    这些都是好问题,顺便说一句,希望对您有所帮助。 async/await 可能相当神秘,但将它们视为事件队列确实有助于理解执行流程恕我直言。

    【讨论】:

    • 1 - 我的问题是 Future 代码何时被放入事件队列中?我想“当await 被调用时”是正确的答案,但是当没有await 时呢,比如Future API?
    • 3 - 那么为什么文档heresync functions execute synchronously until the first await or return
    • 4 - 我可以调用一个异步函数并在那里阻塞代码,而不是等待事件队列稍后将其接收吗? IIRC C# 对他的async``await 有类似的东西,取决于我们如何调用TaskFuture 的 C# 版本)它会阻塞,就好像它是一个同步函数一样,或者它将使用事件队列并异步运行。
    • 第一个问题:Future 的创建将该代码块放入事件队列中。如果该 Future 附加了一个 then(...) 块,则该代码在第一个 Future 完成后被推入事件队列。 await 有效地说:“嘿,在这个异步函数中获取我之后的所有代码,从中创建一个 Future,并将其放入事件队列中,以便在我们等待完成的当前 Future 之后运行”。
    • 感谢 spenster,您非常乐于助人,并且您对 dart 语言确实有深入的了解,我感谢所有帮助,最后一个链接向我展示了下一个 topic,它说明了我质疑的其他事情之前。
    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 2021-12-19
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多