如果流没有在持续时间内完成,Dart Streams 可以发出一个值吗?

Can Dart Streams emit a value if the stream is not done within a duration?

我正在开发一个使用 bloc 来控制视图状态的 Flutter 应用程序。我想调用和外部 API,如果它响应很快,通过 yielding 结果状态立即显示结果。但是,如果调用时间超过 5 秒,我想产生一个状态,指示响应需要一段时间,同时仍在等待 API 到 return。我如何使用 Dart Streams 来做到这一点,无论是原生的还是使用 RxDart?

所有 Futures 都有一个延迟超时,您可以使用例如

try{
  var timer = Timer(Duration(seconds: 3), () {
    yield SlowAPI();
  });
  YourFeature.whenComplete((){
    timer.cancel();
  });

  yield Success();
}catch(e){
   yield Error();
}

这可以使用 Stream.timeout 来完成。谢谢@pskink!

Stream<String> delayedCall() async* {
  yield 'Waiting';
  final apiCall =  Future.delayed(Duration(seconds: 5)).then((_) => 'Complete');
  yield* Stream.fromFuture(apiCall).timeout(
    Duration(seconds: 3), 
    onTimeout: (eventSink) => eventSink.add('Still waiting'),
  );
}


void main() {
  final stream = delayedCall();
  stream.listen(print);
}