我偶然发现了这段代码:
编辑:下面的代码片段是完全可用的,我试图理解如果除了“工作”之外,它是否会由于可能的竞赛条件而导致错误?
if (!_downloaders.containsKey(page)) {
_downloaders[page] = NetworkProvider().getRecentPodcasts(page);
_downloaders[page].then((_) => _downloaders.remove(page));
}
final podcasts = await _downloaders[page];我不能把我的头绕在一个地方:
_downloaders[page].then((_) => _downloaders.remove(page));在这里,在向这个future添加了一个Map之后,我们通过调用then()来执行future,因为我们希望在future完成之后,future被从Map中删除。
这里的一切都很清楚,但是在下一行中,我们将await称为Future,它已经添加到Map中,很快就会被删除。
我真的不明白这怎么是好代码,因为在我看来,当用then()调用未来时,我知道代码执行不会停止于then() (但是对于await),但是是否有一个远程的情况,它可能到达await部分,但是future不再在Map中了,因为它已经被删除了?
或者这是不可能的,如果是的话,你能解释一下内在的工作原理吗?这样我就能完全掌握这个概念并改进我的代码库。
发布于 2021-05-18 21:04:39
--我真的不明白这是如何的好代码,因为在我看来,当
then()调用未来时,我知道代码执行不会停止于then()(但是对于await),但是是否有一个远程的情况,它可能到达await部分,但是future不再在Map中了,因为它已经被删除了?
Future.then()不执行Future的计算。Future.then()只注册一个回调。
引证的准则通常不应该是不公正的。Future通常是异步的;即使Future的计算已经完成,在Dart运行时返回到事件循环之前,.then()回调也不会执行,在这种情况下,事件循环将发生在await行中。
void main() async {
print('Constructing Future');
var future = Future.sync(() => print('Ran future'));
print('Constructed Future; registering callback');
// ignore: unawaited_futures
future.then((_) => print('Ran .then() callback'));
print('Registered callback; awaiting');
await future;
print('Done');
}它将打印:
Constructing Future
Ran future
Constructed Future; registering callback
Registered callback; awaiting
Ran .then() callback
Done这是可能(但不太可能)的代码可能是在病理案件中。例如,Flutter提供了一个SynchronousFuture类,它实现了Future接口,但在注册时同步执行其.then()回调。然而,这是相当不寻常的(这也是为什么SynchronousFuture的文档显式地不鼓励使用它)。要做到这一点,NetworkProvider().getRecentPodcasts实现必须显式返回一个SynchronousFuture (或一些类似的实现)。
https://stackoverflow.com/questions/67586678
复制相似问题