首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤栗:我能打电话给同样的未来吗?首先是“然后()”,然后是“等待”,而不涉及比赛条件问题?

颤栗:我能打电话给同样的未来吗?首先是“然后()”,然后是“等待”,而不涉及比赛条件问题?
EN

Stack Overflow用户
提问于 2021-05-18 12:58:16
回答 1查看 1.5K关注 0票数 1

我偶然发现了这段代码:

编辑:下面的代码片段是完全可用的,我试图理解如果除了“工作”之外,它是否会由于可能的竞赛条件而导致错误?

代码语言:javascript
复制
  if (!_downloaders.containsKey(page)) {
    _downloaders[page] = NetworkProvider().getRecentPodcasts(page);
    _downloaders[page].then((_) => _downloaders.remove(page));
  }
  final podcasts = await _downloaders[page];

我不能把我的头绕在一个地方:

代码语言:javascript
复制
_downloaders[page].then((_) => _downloaders.remove(page));

在这里,在向这个future添加了一个Map之后,我们通过调用then()来执行future,因为我们希望在future完成之后,future被从Map中删除。

这里的一切都很清楚,但是在下一行中,我们将await称为Future,它已经添加到Map中,很快就会被删除。

我真的不明白这怎么是好代码,因为在我看来,当用then()调用未来时,我知道代码执行不会停止于then() (但是对于await),但是是否有一个远程的情况,它可能到达await部分,但是future不再在Map中了,因为它已经被删除了?

或者这是不可能的,如果是的话,你能解释一下内在的工作原理吗?这样我就能完全掌握这个概念并改进我的代码库。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-18 21:04:39

--我真的不明白这是如何的好代码,因为在我看来,当then()调用未来时,我知道代码执行不会停止于then() (但是对于await),但是是否有一个远程的情况,它可能到达await部分,但是future不再在Map中了,因为它已经被删除了?

Future.then()不执行Future的计算。Future.then()只注册一个回调。

引证的准则通常不应该是不公正的。Future通常是异步的;即使Future的计算已经完成,在Dart运行时返回到事件循环之前,.then()回调也不会执行,在这种情况下,事件循环将发生在await行中。

代码语言:javascript
复制
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');
}

它将打印:

代码语言:javascript
复制
Constructing Future
Ran future
Constructed Future; registering callback
Registered callback; awaiting
Ran .then() callback
Done

这是可能(但不太可能)的代码可能是在病理案件中。例如,Flutter提供了一个SynchronousFuture类,它实现了Future接口,但在注册时同步执行其.then()回调。然而,这是相当不寻常的(这也是为什么SynchronousFuture的文档显式地不鼓励使用它)。要做到这一点,NetworkProvider().getRecentPodcasts实现必须显式返回一个SynchronousFuture (或一些类似的实现)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67586678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档