关于使用 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 而没有使用它,我猜垃圾收集器会在你的代码中不再引用它时简单地释放它的内存。