如何从未来返回未来?或者这在异步库中是禁止的



如何从未来对象返回未来值?这段代码不能运行。

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);
      });
    }

如何防止不必要的拆封?

在这种情况下,async库'Future'声明为泛型类。

abstract class Future<T> {
}

如果我创建如下表达式

new Future<Future<int>>();

然后将类型T指定为Future<int>,从泛型类Future期望的结果是什么?

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

Future<int>.

但结果并不如预期。在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的未来有些特殊(魔法)?

查看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.

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

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)];
  });
}

不需要任何额外的包装。根据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);
  });
}

这样使用起来干净多了,并提供了预期的结果。

最新更新