通过流发送未来

时间:2019-10-17 14:54:20

标签: dart dart-async

我想知道,是否有可能通过流将Future发送给在听众“接收”后可以解决的流?

干杯!

2 个答案:

答案 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对象。