我为我的元素的所有实例定义了一个静态var作为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中。所以我需要他们等待,直到数据在地图中。
答案 0 :(得分: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.
答案 1 :(得分:2)
回应GünterZö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;
}