【问题标题】:Dart: Use Futures to asynchronously fill a static varDart:使用 Futures 异步填充静态变量
【发布时间】:2014-11-04 09:50:25
【问题描述】:

我已经为我的元素的所有实例定义了一个静态变量作为 Map。如果它包含一个特定的键,它应该使用该值。如果键不包含,则实例应通过请求获取数据并将其保存在静态映射中,以便其他实例可以使用它。

static var data = new Map();

func() {
  if (Elem.data.containsKey(['key']) {
    list = Elem.data['key'];
  }
  else {
    Helper.getData().then((requestedData) {
      list = requestedData;
      Elem.data.addAll({ 'key' : requestedData });
  }
}

问题是我的所有实例都进入了 else,因为此时其他实例位于 if 中时,密钥不包含在 Map 中。所以我需要他们等待,直到数据在地图中。

【问题讨论】:

    标签: dart dart-async


    【解决方案1】:
    static var data = new Map();
    static Completer _dataCompleter;
    
    Future<bool> func() {
      if(_dataCompleter == null) {
        _dataCompleter = new Completer();
        Helper.getData().then((requestedData) {
          list = requestedData;
          Elem.data.addAll({ 'key' : requestedData });
          _dataCompleter.complete(true);
        })
      } 
      if(_dataCompleter.isCompleted) {
        return new Future.value(true);
      } 
      return _dataCompleter.future;
    }
    

    然后这样称呼它

    func().then((success) => /* continue here when `key` in `data` has a value.
    

    【讨论】:

    • 两种方法都可以填充地图。我知道这一点,这就是为什么我要问如何让其他实例等到地图被填满
    • 每个实例仍然做一个请求......完成器不应该是静态的,所以每个实例都可以看到它吗?
    • 你是对的。起初我有,但做了不同的尝试,然后就忘记了。
    • 这很好。谢谢。可悲的是,我很难理解 Futures 和 Completers..
    • 我稍微修改了代码。我还没有尝试过,但我认为这对于在 getData 已经完成时进入的呼叫是必要的。一开始我也很难过,但你习惯了。只是不要试图避免它,你会发现在 Dart 中你无法避免它。即将到来的 async/await 将使它变得更容易(通过在启动 Dart VM 或 Dartium 时传递一个标志,已经处于实验状态)
    【解决方案2】:

    回应 Günter Zöchbauer。我一般会避免直接使用Completers:

    static var data = new Map();
    static Future _pendingFuture;
    
    Future func() {
      if (_pendingFuture == null) {
        _pendingFuture = Helper.getData().then((requestedData) {
          list = requestedData;
          Elem.data.addAll({ 'key' : requestedData });
        });
      }
      return _pendingFuture;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      相关资源
      最近更新 更多