1

如何从 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<int>泛型类 Future 的预期结果?

我认为结果必须与 type argument 中指定的一样T

IEFuture<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 中的未来有什么特别的(魔法)?

4

2 回答 2

4

查看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)];
  });
}
于 2013-06-05T17:17:06.910 回答
3

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

如果返回值本身是 [Future],则创建的 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);
  });
}

这更干净,并提供了预期的结果。

于 2013-06-05T17:21:11.307 回答