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

时间:2013-06-05 15:27:26

标签: dart dart-async

如何从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);
      });
    }

如何防止不必要的展开?

在这种情况下,异步库&#39;未来&#39;声明为泛型类。

abstract class Future<T> {
}

如果我创建表达式如下

new Future<Future<int>>();

然后将T类型指定为Future<int>,其结果是通用类Future的结果?

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

即。 Future<int>.

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

如果这是&#34;功能&#34; (但我认为异常行为错误地调用&#34;功能&#39;)然后为什么没有在Dart API中记录?

如何解释这种差异?

为什么此代码不会生成错误和警告?

另一个IDENTICAL示例,但没有使用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中的未来有些特殊(魔术)?

2 个答案:

答案 0 :(得分: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)];
  });
}

答案 1 :(得分: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);
  });
}

使用起来更干净,并提供预期效果。