【问题标题】:How a non async value is wrapped in a Future using await?如何使用 await 将非异步值包装在 Future 中?
【发布时间】:2021-04-14 11:10:33
【问题描述】:

Docs 说:

在await表达式中,表达式的值通常是一个Future;如果不是,则该值会自动包装在 Future 中。

所以,如果我使用:

void main() async {
  var a = await 1;
  print(a); // Prints 1
  print(Future.value(1)); // Prints `Instance of _Future<int>`. 
}

使用文档所说的,第一次打印应该打印Instance of _Future&lt;int&gt;,但它会打印1。谁能用the value is automatically wrapped in a Future解释那条线是什么意思?

【问题讨论】:

  • @Dude "在await表达式中,表达式的值通常是一个Future;如果不是,则该值会自动包装在一个Future中。"跨度>
  • @Dude 是不是意味着1 被包裹在Future 中,如果是的话,它不应该打印Future&lt;int&gt; 吗?
  • 这意味着1被包裹在Future中,所以await 1等价于await Future.value(1),然后等待那个future完成并计算为1。跨度>
  • @lrn 谢谢,你介意把它写成答案吗?

标签: dart


【解决方案1】:

意义

await表达式中,表达式的值通常是Future;如果不是,则该值会自动包装在 Future 中。

对于像await 1 这样的表达式,其中1 的值不是Future1Future.value(1) 替换。 await 的含义可以完全根据它对期货的作用来定义,很明显,await 会有一个异步延迟

await 1,又名。 await Future.value(1),等待未来以值1 完成,然后整个await 1 表达式计算为该值。 await 总是从值中移除“一层Future”,方法是等待未来完成一个值,然后计算为该值。

对于await e,如果e 抛出,那么await e 也会立即抛出。该错误不会在未来结束。仅当 e 计算为一个值,并且该值没有实现 Future,然后该值被包装,以便它可以等待并再次解包。

【讨论】:

    【解决方案2】:

    await 导致函数等待 Future 完成。本示例代码:

    waitFunction1() async {
      var x = await 1;
      print(x);
      return x;
    }
    
    waitFunction2() async {
      var x = await 2;
      print(x);
      return x;
    }
    
    main(List<String> args) async {
      var x = waitFunction1();
      print('1: $x');
      var y = await waitFunction2();
      print('2: $y');
      var z = await x;
      print('1: $z');
    }
    

    产生输出:

    1: Instance of 'Future<dynamic>'
    1
    2
    2: 2
    1: 1
    

    waitFunction1 的调用返回Future。稍后当它等待它时,我们会得到 Future 包裹的值。

    【讨论】:

    • 感谢您的回答。但是waitFunction1 已经是Future,但在我的问题中,我问的是如何将“非异步”值包装在Future 中。也许我不明白你的答案是如何回答帖子的。
    • 在我的示例中,我拥有与您相同的 await 1。正如您在我的输出中看到的那样,这将1 包装在Future 中。在您的代码中,await 关键字会导致您的异步函数main 阻塞并等待Future 的结果,这当然是1。因为您使用await,所以您的函数看不到Future,但您的函数的调用者会看到,正如您在我的输出中看到的那样。
    • 如果你的函数有var a = Future.value(1),那么print(a)会显示Future,然后在await a之后会显示1
    • 即使您没有await 1 和带有此签名Future&lt;int&gt; f() =&gt; 1 的函数的空白主体,它也会打印Instance of Future&lt;int&gt;,因此您的代码中的await 1 不是真的什么都做。
    • 无论如何,@lrn 已经回答了评论中的问题,谢谢你的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多