4

我已经为我的元素的所有实例定义了一个静态变量作为 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 中。所以我需要他们等待,直到数据在地图中。

4

2 回答 2

4
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.
于 2014-11-04T09:55:05.023 回答
2

回应 Günter Zöchbauer。我通常避免Completer直接使用 s :

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-11-05T07:27:05.893 回答