等待和完成者之间的飞镖关系

时间:2020-01-31 05:36:58

标签: dart future

以下示例有些人为设计,但我试图理解“完成者”与等待产生的未来之间的关系。

在下面的示例中,“ doCalc”方法包含一个“ await”调用和一个Completer。

据我了解,当dart命中“ await”语句时,它将立即停止执行该方法并返回将来。

如果在dartpad中运行代码,则可以在输出中看到。 value = Instance of '_Future<int>'行将立即打印。

这符合我的期望(即等待导致该方法立即返回)。 您可以从“ value =”行中看到doCalc返回了Future<int>

这也符合预期。

我遇到的问题是doCalc的最后一行也返回了future。在这种情况下,完成者将产生未来。

因此,doCalc似乎会返回两种不同的期货。

1)第一个飞镖在调用await时隐式返回。

2)我通过return语句明确返回的第二个。

鉴于'res'的值必须包含第一个future(在返回完成者的future之前我们打印其值),行会怎么样,然后等到第二个future完成。

这里似乎有些魔术,但是我找不到关于它的任何文档。

飞镖垫链接:

https://dartpad.dev/a42cce3edf01b222206a627e8c8106af

import 'dart:async';
void main() {

  print('hi');
  var res = doCalc();
  print('value = ${res}');

  res.then((result) => print('result = $result'));
}

Future<int> doCalc() async
{
  var done = Completer<int>();

  await Future.delayed(Duration(seconds: 4), 
                 () { 
                   done.complete(10);

                     });

  return done.future;
}

1 个答案:

答案 0 :(得分:0)

async函数返回它自己创建的future。它“立即”执行此操作,这意味着它将执行主体,直到返回未来之前的第一个异步延迟(awaitawait for)为止。

return函数中的任何async语句用于完成返回的未来。 如果您的async函数返回一个Future<int>,那么您的return语句必须返回一个int或一个Future<int>。 在前一种情况下,返回的future用该整数完成。 在后一种情况下,返回的期货将以与返回期货相同的结果(将其命名为)完成时完成。

好像return expression;函数中的async实际上是return await expression;。 在此示例中,该行:

return done.future;

可以读为

return await done.future;

这应该解释您所看到的行为。