2014-11-04 2 views
4

Я определил статический var как Map для всех экземпляров моего элемента. Если он содержит определенный ключ, он должен использовать значение. Если ключ не содержит экземпляр, он должен получить данные с запросом и сохранить его в статической карте, чтобы другие экземпляры могли его использовать.Dart: использовать фьючерсы для асинхронного заполнения статического var

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

+0

Я обновил свой ответ. –

+1

Каждый экземпляр все еще выполняет запрос ... Не должен быть статичным, чтобы каждый экземпляр мог его видеть? – Azael

2

В ответ на Гюнтера 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; 
}