如何从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中的未来有些特殊(魔术)?
答案 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);
});
}
使用起来更干净,并提供预期效果。