以下示例有些人为设计,但我试图理解完成者与等待产生的未来之间的关系。
在下面的示例中,'doCalc'方法包含一个'await'调用和一个Completer。
我的理解是,当dart击中'await'语句时,它将立即停止执行该方法并返回将来。
如果您在dartpad中运行代码,则可以在输出中看到它。 value = Instance of '_Future<int>'
行将立即打印。
这符合我的期望(即等待导致该方法立即返回)。您可以从'value ='行中看到doCalc返回了Future<int>
。
这也符合预期。
我遇到的问题是doCalc的最后一行也返回了Future。在这种情况下,完成者将产生未来。
这样看来,doCalc会返回两个不同的期货。
1)第一个飞镖在调用await时隐式返回。
2)我通过return语句显式返回的第二个。
鉴于'res'的值必须包含第一个未来(在返回完成者的future之前我们打印其值),行res.then一直等待直到第二个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;
}
async
函数返回其创建的未来。它“立即”执行操作,这意味着它将执行主体,直到返回将来的第一个异步延迟(await
或await for
)为止。
C0]函数中的任何return
语句用于complete返回的将来。如果async
函数返回async
,则Future<int>
语句必须返回return
或int
。在前一种情况下,返回的future用该整数完成。在后一种情况下,返回的未来将以与返回未来相同的结果(将其命名为)when返回未来完成。
好像Future<int>
功能中的return expression;
实际上是async
。在此示例中,该行:
return await expression;
可以读为
return done.future;
并且应该解释您所看到的行为。