关于使用期货和完成者的问题

时间:2015-06-07 01:57:00

标签: dart dart-async

嘿,我已经阅读了关于期货的所有信息,但我想了解更多有关正确用法的建议。

我正在编写一个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>

谢谢:)

2 个答案:

答案 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;
  }
}