Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 以流送未来_Dart_Dart Async - Fatal编程技术网

Dart 以流送未来

Dart 以流送未来,dart,dart-async,Dart,Dart Async,我想知道,有没有可能通过一个流发送一个未来的,这个流在被一个听众“接收”后可以得到解决 干杯 我不知道你为什么要这样做,但我肯定你能做到: import 'dart:async'; void main() { final controller = StreamController<FutureOr<int>>(); controller.sink.add(Future.delayed(Duration(seconds: 1), () => 5)); p

我想知道,有没有可能通过一个流发送一个
未来的
,这个流在被一个听众“接收”后可以得到解决


干杯

我不知道你为什么要这样做,但我肯定你能做到:

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>>
}
导入'dart:async';
void main(){
最终控制器=StreamController();
controller.sink.add(Future.delayed(持续时间(秒:1),()=>5));
打印(controller.stream.first.runtimeType);/\u
}

当您将未来添加到接收器时,它不会自动等待。因此,如果您将未来对象放入接收器中,则从流中得到的是未来对象。

未来只是值,因此您可以创建
流。未来的接受者可以正常地等待未来,你可以在两者之间的任何时候完成它

但是,由于双异步,人们通常不赞成它

它所做的是让接收器等待一个流事件,您在某个点发出该事件,然后让接收器再次等待可能在更晚的点出现的实际结果

最紧迫的问题是,当你完成它时,你并不总是知道未来是否已经收到。也许接收者暂停了数据流,也许你比你预期的要快。在任何情况下,如果您在收到错误之前就完成了未来,那么该错误很可能会以未完成告终,这可能会使您的整个程序崩溃

它的可用性也很差。如果你在发送端等待未来,并且只在结果准备好时发送事件,那么对接收者来说就更容易、更简单了(他们只是得到了正常的结果),而且它通常也同样擅长于实现你想要实现的目标

如果你真的有一个异步结果(期货)可以按任意顺序完成的情况,但是接收方需要知道期货本身的原始顺序,那么我猜一个<代码>流>代码>可以是答案(但是要考虑你的解决方案是否只是不必要的复杂)。 示例(完全通用):

流随机延迟(){
var controller=StreamController();
controller.onListen=(){
var rng=Random();
对于(int i=0;i<10;i++){
var延迟=rng.nextInt(10);
var completer=completer();
controller.add(completer.future);
计时器(持续时间(秒:延迟),(){
完成者。完成者(i);
});
}
controller.close();
}
}
或更简单:

Future<Stream<int>> randomDelays() async* {
  var rng = Random();
  for (int i = 0; i < 10; i++) {
    var delay = rng.nextInt(10);
    yield Future.delayed(Duration(seconds: delay), () => i);
  }
}
Future randomDelays()异步*{
var rng=Random();
对于(int i=0;i<10;i++){
var延迟=rng.nextInt(10);
产生未来延迟(持续时间(秒:延迟),()=>i);
}
}
Future<Stream<int>> randomDelays() async* {
  var rng = Random();
  for (int i = 0; i < 10; i++) {
    var delay = rng.nextInt(10);
    yield Future.delayed(Duration(seconds: delay), () => i);
  }
}