2014-11-04 15 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; 
}