关于使用 Futures 和 Completers 的问题
Questions about using Futures and Completers
嘿,我已经阅读了所有我能找到的关于期货的内容,但我想要更多关于正确使用的建议。
我正在编写一个 API 库,它弥合了 HTTP 请求和应用程序之间的差距。所以在大多数情况下我使用 HTTP 返回的未来,但有时数据已经被检索到。现在是使用完成者的合适时机吗?
例如
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,但最终没有使用它的 future 或调用 complete。这会导致内存泄漏吗?我应该调用它的完整方法还是以某种方式处理它?
谢谢:)
改用 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;
}
}
如果可以立即访问该值,则可以使用命名构造函数 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
而没有使用它,我猜垃圾收集器会在你的代码中不再引用它时简单地释放它的内存。
嘿,我已经阅读了所有我能找到的关于期货的内容,但我想要更多关于正确使用的建议。
我正在编写一个 API 库,它弥合了 HTTP 请求和应用程序之间的差距。所以在大多数情况下我使用 HTTP 返回的未来,但有时数据已经被检索到。现在是使用完成者的合适时机吗?
例如
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,但最终没有使用它的 future 或调用 complete。这会导致内存泄漏吗?我应该调用它的完整方法还是以某种方式处理它?
谢谢:)
改用 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;
}
}
如果可以立即访问该值,则可以使用命名构造函数 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
而没有使用它,我猜垃圾收集器会在你的代码中不再引用它时简单地释放它的内存。