使用 Rx 订阅布尔状态
Subscribe on bool state using Rx
我有一个 IObservable<bool>
,我希望在最后 n
项设置为真时收到通知。
为此,我正在尝试以下操作:
MyBool.Buffer(10).SelectMany(x => x).All(x => x).Subscribe(x => /*do something*/);
但它只触发一次;似乎 OnCompleted
不知何故被解雇了。
您正在有效地缓冲和展平您的可观察对象。调用 .Buffer(10).SelectMany(x => x)
就像一个非操作,因为它会发出所有输入的内容。
你需要做的更像这样:
MyBool
.Buffer(10, 1)
.Select(xs => xs.All(x => x))
.Where(x => x);
我假设您想在连续出现 10 个 true 时知道,因此如果有 11 个,您会收到两次通知。
Buffer(10, 1)
背后的原因是 Buffer
的工作方式 - 这提供了 10
个元素的缓冲区并移动 1
。如果我这样做 Buffer(10)
我会得到 10 个元素并向前移动 10 个。
如果我做了 Observable.Range(0, 5).Buffer(3)
,我会得到 {0, 1, 2}, {3, 4}
,但如果我做了 Observable.Range(0, 5).Buffer(3, 1)
,我会得到 {0, 1, 2}, {1, 2, 3}, {2, 3, 4}, {3, 4}, {4}
。
如果你想知道 false
何时在 trues
之后出现,那么试试这个:
MyBool
.Buffer(3, 1)
.Select(xs => xs.All(x => x))
.Buffer(2, 1)
.Where(x => x[0] || x[1]);
这给出了这些可能的组合:
我有一个 IObservable<bool>
,我希望在最后 n
项设置为真时收到通知。
为此,我正在尝试以下操作:
MyBool.Buffer(10).SelectMany(x => x).All(x => x).Subscribe(x => /*do something*/);
但它只触发一次;似乎 OnCompleted
不知何故被解雇了。
您正在有效地缓冲和展平您的可观察对象。调用 .Buffer(10).SelectMany(x => x)
就像一个非操作,因为它会发出所有输入的内容。
你需要做的更像这样:
MyBool
.Buffer(10, 1)
.Select(xs => xs.All(x => x))
.Where(x => x);
我假设您想在连续出现 10 个 true 时知道,因此如果有 11 个,您会收到两次通知。
Buffer(10, 1)
背后的原因是 Buffer
的工作方式 - 这提供了 10
个元素的缓冲区并移动 1
。如果我这样做 Buffer(10)
我会得到 10 个元素并向前移动 10 个。
如果我做了 Observable.Range(0, 5).Buffer(3)
,我会得到 {0, 1, 2}, {3, 4}
,但如果我做了 Observable.Range(0, 5).Buffer(3, 1)
,我会得到 {0, 1, 2}, {1, 2, 3}, {2, 3, 4}, {3, 4}, {4}
。
如果你想知道 false
何时在 trues
之后出现,那么试试这个:
MyBool
.Buffer(3, 1)
.Select(xs => xs.All(x => x))
.Buffer(2, 1)
.Where(x => x[0] || x[1]);
这给出了这些可能的组合: