我想知道,是否有可能通过流将Future
发送给在听众“接收”后可以解决的流?
干杯!
答案 0 :(得分:1)
未来只是价值,因此您可以制作int array[i] ={ 1, 2, 3, 4, 5};
。然后,未来的接收者可以正常等待未来,您可以在两者之间的任何时候完成它。
但是,由于双重异步性,人们通常对此表示反对。
它的作用是使接收器在某一时刻等待流事件,然后让接收器再次等待可能在以后发生的实际结果。
最紧迫的问题是,当您完成未来时,您并不总是知道未来是否已经到来。也许接收方暂停了流,也许您比预期的要快。无论如何,如果您在收到错误之前完成了将来的工作,那么该错误很可能最终将无法解决,这可能会使整个程序崩溃。
它的可用性也很差。如果您改为等待发送方的未来,并且仅在结果准备好后才发送事件,则对于接收方而言,它更容易和更简单(它们只是获得正常的结果),并且通常可以很好地实现所需的结果实现。
如果您确实有许多异步结果(期货)可以按任何顺序完成的情况,但是接收方需要知道期货本身的原始顺序,那么我猜Stream<Future>
可以是答案(但要考虑您的解决方案是否只是不必要的复杂)。
示例(完全笼统):
Stream<Future<X>>
或更简单:
Stream<Future<int>> randomDelays() {
var controller = StreamController<Future<String>>();
controller.onListen = () {
var rng = Random();
for (int i = 0; i < 10; i++) {
var delay = rng.nextInt(10);
var completer = Completer<int>();
controller.add(completer.future);
Timer(Duration(seconds: delay), () {
completer.complete(i);
});
}
controller.close();
}
}
答案 1 :(得分:0)
我不确定您为什么要这么做,但可以确定:
import 'dart:async';
void main() {
final controller = StreamController<FutureOr<int>>();
controller.sink.add(Future.delayed(Duration(seconds: 1), () => 5));
print(controller.stream.first.runtimeType); // _Future<FutureOr<int>>
}
将Future添加到接收器后,不会自动等待它。因此,如果将Future对象放在接收器中,那么从Stream中得到的就是Future对象。