如果流没有在持续时间内完成,Dart Streams 可以发出一个值吗?
Can Dart Streams emit a value if the stream is not done within a duration?
我正在开发一个使用 bloc 来控制视图状态的 Flutter 应用程序。我想调用和外部 API,如果它响应很快,通过 yield
ing 结果状态立即显示结果。但是,如果调用时间超过 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);
}
我正在开发一个使用 bloc 来控制视图状态的 Flutter 应用程序。我想调用和外部 API,如果它响应很快,通过 yield
ing 结果状态立即显示结果。但是,如果调用时间超过 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);
}