如何从未来对象返回未来值?这段代码不能运行。
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);
});
}
这样使用起来干净多了,并提供了预期的结果。