2014-11-04 17 views
4

我已经为我的元素的所有实例定义了静态变量为Map。如果它包含一个特定的键,它应该使用该值。如果密钥不包含,实例应该获取请求的数据并将其保存在静态映射中,以便其他实例可以使用它。Dart:使用期货异步填写静态变量

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 }); 
    } 
} 

的问题是,我所有的情况下,进入别的,因为关键是不能在此刻的其他实例是在如果地图包含。所以我需要他们等待,直到数据在地图中。

回答

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. 
+0

两种方法的工作,填补了地图。我意识到这一点,为什么我问我如何让其他实例等到地图填充 – Azael 2014-11-04 09:59:29

+0

我更新了我的答案。 – 2014-11-04 10:04:23

+1

每个实例仍然有请求...不应该使用Completer静态,所以每个实例都可以看到它? – Azael 2014-11-04 10:20:12

2

针对冈特Zöchbauer。我一般避免使用Completer小号直接:

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; 
}