嘿,我已经阅读了关于期货的所有信息,但我想了解更多有关正确用法的建议。
我正在编写一个API库,它弥合了HTTP请求和应用程序之间的差距。所以我在大多数情况下使用HTTP返回的未来,但有时数据已被检索。这是使用Completer的合适时间吗?
离。
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;
}
}
-edit-如果我创建了一个Completer,但最终没有使用它的未来或者调用complete。这会导致内存泄漏吗?我应该调用它的完整方法还是以某种方式处理它?</ p>
谢谢:)
答案 0 :(得分:3)
如果可以立即访问该值,则可以使用命名构造函数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
,我想垃圾收集器只会在代码中不再引用它时释放其内存。
答案 1 :(得分: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;
}
}