2015-06-07 45 views
2

嘿,我已閱讀了關於期貨的所有信息,但我想了解一些關於正確使用的更多建議。關於使用期貨和補倉的問題

我正在編寫一個API庫,它彌合了HTTP請求和應用程序之間的差距。所以我在大多數情況下使用HTTP返回的未來,但有時候數據已經被檢索。那是使用Completer的適當時機嗎?

ex。

String _someData = ""; 

Future<String> getSomeData(){ 
    if (_someData == ""){ 
    return Api.getSomeData().then((String someData){ 
     _someData = someData; 
     return _someData; 
    }); 
    } else { 
    var completer = new Completer(); 
    completer.complete(_someData); 
    return completer.future; 
    } 
} 

CNC中另外,如果我創建一個完成者,但最終沒有使用其未來或調用完成。會導致一個mem泄漏?我應該調用它的完整方法還是以某種方式處理它?

謝謝:)

回答

2

使用一個async函數。

import "dart:async"; 

String _someData = ""; 

Future<String> getSomeData() async { 
    if (_someData == "") { 
    _someData = await Api.getSomeData(); 
    } 

    return _someData; 
} 

編譯器產生大約下面的代碼:

import "dart:async"; 

String _someData = ""; 

Future<String> getSomeData() { 
    var $_awaiter = new Completer<String>(); 
    try { 
    if (_someData == "") { 
     Api.getSomeData().then(($) { 
     $_awaiter.complete($); 
     }).catchError((e, s) { 
     $_awaiter.completeError(e, s); 
     }); 

     return $_awaiter.future; 
    } else { 
     $_awaiter.complete(_someData); 
     return $_awaiter.future; 
    } 
    } catch (e, s) { 
    $_awaiter.completeError(e, s); 
    return $_awaiter.future; 
    } 
} 
+0

這不會將_someData設置爲未來嗎?也不會阻止,直到Api.getSomeData()返回其未來? – Krtko

+1

@Krtko運營商'await'永遠'unwrap'未來。所以,在這種情況下,你會得到一個'Future.result'。它不會阻塞'Api.getSomeData()'的調用,它會像計算方式一樣鏈接計算,就像你將使用'Future.then()', – mezoni

+0

Ah OK謝謝,但它仍然阻止正確? – Krtko

2

您可以使用名爲constructor Future.value如果值是立即訪問。你不需要Completer

String _someData = ""; 

Future<String> getSomeData(){ 
    if (_someData == ""){ 
    return Api.getSomeData().then((String someData){ 
     _someData = someData; 
     return _someData; 
    }); 
    } else { 
    return new Future.value(_someData); 
    } 
} 

而對於第二個問題,如果你不使用它創建一個Completer,我猜垃圾收集器會簡單地釋放其內存時不會有再在你的代碼對它的引用。

+0

非常感謝 – Krtko

+1

這種方式的缺點是,如果將_somedata從字段更改爲getter,並且如果此getter會拋出異常,那麼函數getSomeData將不會返回結果',在我們的例子中),但它會拋出一個異常。這意味着它是一個不安全的(半異步)實現,並且需要在使用它的其他代碼中採取特殊的預防措施,因爲它不能確保它返回「Future」。 – mezoni