首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用异步方法,它需要完成另一个方法的完成

调用异步方法,它需要完成另一个方法的完成
EN

Stack Overflow用户
提问于 2022-03-17 17:28:14
回答 1查看 30关注 0票数 0

我不知道如何命名这个名字,但这是我的问题:

我有一个类负责存储要初始化的相当重的对象。在第一次调用该类时,我希望初始化静态对象,然后可以使用其他方法检索对象。我检索对象的方法是异步的,如果调用得太快,我希望它等待初始化完成。

但是,我不知道如何等待初始化完成.可能和小溪在一起?

这里有一些代码来说明我的位置:

代码语言:javascript
复制
class Cartography{
  static Polygon? _bigObject;
  static bool _isLoading = false;

  Cartography(){
    _loadElement();
  }

  Future<void> _loadElement() async {
    if(_bigobject == null && _isLoading == false){
      _isLoading = true;
      _bigObject = await bigFunction();  // Loading object ...
      _isLoading = false;
    }
  }

  Future<Polygon> getPolygon() async {
    await ???? // Waiting the end of the initialisation if the bigObject is not yet initialized ...
    // TODO Ask to StackOverflow ...
    return _bigObject;
  }
}

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2022-03-17 18:40:08

你最需要的是:

代码语言:javascript
复制
await _loadElement();

但是,如果在对_loadElement()的早期调用仍在运行中时可以调用_loadElement(),则它的行为将不正确。第二个调用将看到_isLoading为真并立即返回,第二个调用将在设置_bigObject之前完成。

与维护bool _isLoaded标志不同,您可以存储对_loadElement的第一次调用的Future,并进行所有后续调用-- await --相同的Future

我使用的一个模式是:

代码语言:javascript
复制
Future<void>? _loadingFuture;

Future<void> _loadElement() async {
  Future<void> internalLoad() async {
    _bigObject = await bigFunction();
  }

  return await (_loadingFuture ??= internalLoad());
}

Future<Polygon> getPolygon() async {
  await _loadElement();
  ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71516644

复制
相关文章

相似问题

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