【问题标题】:How return Future from Future? Or this is prohibited in async library?如何从 Future 返回 Future?或者这在异步库中是禁止的?
【发布时间】:2013-06-01 09:18:13
【问题描述】:

如何从 Future 对象返回 Future 值? 此代码不起作用。

import 'dart:async';

    void main() {
      var temp = foo();
      temp.then((Future<int> future) {
        future.then((int result) {
          print(result);
        });
      });
    }

    Future<Future<int>> foo() {
      return new Future<Future<int>>(() {
        return new Future<int>(() => 5);
      });
    }

如何防止不必要的展开?

在这种情况下,异步库“Future”被声明为泛型类。

abstract class Future<T> {
}

如果我创建如下表达式

new Future<Future<int>>();

然后将类型T 指定为Future&lt;int&gt; 泛型类Future 预期的结果是什么?

我认为结果必须与类型参数 T 中指定的一致。

Future&lt;int&gt;.

但结果并不如预期。 在 Dart API 站点上没有找到有关此异常行为的信息。

如果这是一个“功能”(但我认为异常行为错误地称为“功能”)那么为什么它没有记录在 Dart API 中?

如何解释这种差异?

为什么这段代码没有产生错误和警告?

另一个相同的示例,但不使用 Future。

void main() {
  var temp = foo();
  temp.baz((Foo<int> foo) {
    foo.baz((int result) {
      print(result);
    });
  });
}

Foo<Foo<int>> foo() {
  return new Foo<Foo<int>>(() {
    return new Foo<int>(() => 5);
  });
}

如果在这种情况下结果与使用 Future 时一样(即意外),那么我们如何调用此代码? 正常还是异常?

或者也许 Dart 中的未来有什么特别的(魔法)?

【问题讨论】:

    标签: dart dart-async


    【解决方案1】:

    查看api文档 http://api.dartlang.org/docs/releases/latest/dart_async/Future.html

    上面写着:

    If the returned value is itself a Future, completion of the created future will wait until
    the returned future completes, and will then complete with the same result.
    

    我猜这意味着您不能从 Future 返回 Future。 但是你可以返回一个期货列表。

    void main() {
      var temp = foo();
      temp.then((List<Future<int>> list) {
        list[0].then((int result) {
          print(result);
        });
      });
    }
    
    Future<List<Future<int>>> foo() {
      return new Future<List<Future<int>>>(() {
        return [new Future<int>(() => 5)];
      });
    }
    

    【讨论】:

      【解决方案2】:

      不需要任何额外的包装。根据 Future 文档:

      如果返回值本身是一个[Future],则完成创建 未来将等到返回的未来完成,然后 完成相同的结果。

      这意味着您可以将代码重写为:

      import 'dart:async';
      
      void main() {
        var temp = foo();
        temp.then((int result) {
          print(result);        
        });
      }
      
      Future<int> foo() {
        return new Future<int>(() {
          return new Future<int>(() => 5);
        });
      }
      

      使用起来更加简洁,并提供了预期的结果。

      【讨论】:

      • 返回实际的 Future 很快就会使在复杂的代码库中使用 future 变得不可能。嵌套多个 Future 会使代码不可读且难以使用。我很高兴 Dart 团队以这种方式实现了 Futures。任何关于不符合标准泛型处理的问题都由文档中关于如何处理返回的 Futures 的明确说明来处理。
      • programmers.stackexchange.com 是进行理论讨论的合适场所。
      猜你喜欢
      • 2015-06-08
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      相关资源
      最近更新 更多