【发布时间】:2015-04-16 17:12:15
【问题描述】:
我正在想办法从 Dart 中的 Streams 中获取后续值而不会重复:
// should resolve to first value received in stream
Future f1 = mygetNextValueFn(stream);
// should resolve to second
Future f2 = mygetNextValueFn(stream);
这里的想法是让f1 和f2 解析为流中的后续值,而不是解析为相同的值。如果我从stream 中提取一个值作为未来的f,我想确保解析f 的流值对于f 是唯一的。
我可以使用包装类来做到这一点:
import "dart:async";
import "dart:collection";
class StreamWrapper<T> {
Queue<Completer<T>> _completers;
Queue<T> _values;
_addValue(T value) {
_values.add(value);
_update();
}
_update() {
while (_completers.isNotEmpty && _values.isNotEmpty) {
Completer<T> completer = _completers.removeFirst();
T value = _values.removeFirst();
completer.complete(value);
}
}
Future<T> next() {
var complete = new Completer<T>();
_completers.add(complete);
_update();
return complete.future;
}
StreamWrapper(Stream<T> stream) {
this._completers = new Queue<Completer<T>>();
this._values = new Queue<T>();
stream.listen(_addValue);
}
}
然后可以确保来自streamWrapperInstance.next() 的 Futures 将始终解析为唯一的流输出值。这有点骇人听闻,有没有更标准的方法可以为单个订阅者流做到这一点?
【问题讨论】:
-
如果有请添加mygetNextValueFn的实现。
-
公平地说,您想从流中拉,而不是正常的“流向我推送”吗?
-
如果转换器只输出一个与前一个不同的值,那又如何呢?
-
我没有“mygetNextValueFn”的实现,这是我想要弄清楚的部分。我不确定拉动是否适合我正在尝试做的事情。可以为此实现一个包装器,但我想知道是否有更标准的方法来做到这一点。
-
对我来说仍然不清楚你试图完成什么。您是否希望两个后续订阅者无法获得前一个订阅者已经收到的值?
标签: dart future dart-async