RxJs窗口:未获取最后一个可观察对象

RxJs窗口:未获取最后一个可观察对象,rxjs,reactive-programming,Rxjs,Reactive Programming,我写了这段代码 timer(0, 100) .pipe( windowTime(1000), take(3), flatMap( value => value.pipe(toArray()))) 我不明白为什么在订阅中我只得到2个值。无论n取什么,我总是在订阅中获得n-1值 你能解释一下为什么吗 编辑:我怀疑有一个bug,所以我 有趣的问题 因此,windowTime(1000)将每隔1000毫秒发出一个新窗口。但窗户到底是什么?一个窗口是主题实例 wi

我写了这段代码

timer(0, 100)
  .pipe(
     windowTime(1000),
     take(3),
     flatMap( value => value.pipe(toArray())))
我不明白为什么在订阅中我只得到2个值。无论
n
取什么,我总是在订阅中获得
n-1

你能解释一下为什么吗

编辑:我怀疑有一个bug,所以我

有趣的问题

因此,
windowTime(1000)
将每隔1000毫秒发出一个新窗口。但窗户到底是什么?一个窗口是
主题
实例

windowTime
可以管理多个窗口,但当您仅提供其第一个参数(称为
windowTimeSpan
)时,将只有一个活动窗口。这意味着在
windowTimeSpan
ms通过后,当前窗口将关闭,并创建一个新窗口并推送到流中

当窗口关闭时,表示它将发送完整通知。这是一个非常重要的方面

订阅时,将立即创建一个窗口,并将其推送到流中。
通过执行
flatMap(value=>value.pipe(toArray()))
,可以注册当前窗口(主题)的观察者。它在语义上与
subject.pipe(toArray()).subscribe(subscriber)

为什么会这样?
定时器(01100)
.烟斗(
//每1000毫秒发出一个值(窗口),并关闭(完成)上一个值
窗口时间(1000),
以(3)为例,
flatMap(value=>value.pipe(toArray()))
)
首先,让我们看看
flatMap
flatMap
mergeMap
相同。
mergeMap
所做的是管理内部可观察对象的数量(
concurrent
,默认为
INFINITY
)。正在跟踪一个内部可观察对象,直到它
完成

toArray
在源代码
完成之前积累值的作用是什么。在这种情况下,直到当前
主题
(窗口)
完成
。当窗口关闭时会发生这种情况,更具体地说,当
1000ms
pass时

因此,如前所述,订阅时将立即创建一个窗口。 在
0ms
之后输入一个值(0),在
100ms
之后输入另一个值(1),依此类推,直到值
9
输入。同时,
toArray
收集所有这些值。因此9的到来也标志着
1000ms
,也就是当前窗口将关闭的时间(将发出
完整通知
)。发生这种情况时,
toArray
将收到通知,并将收集的值发送给数据使用者

在此之后,将创建一个新窗口(第二个值为
take(3)
)。然后,输入值10,然后输入值11,以此类推直到19,这标志着另一个
1000ms
,这将导致当前窗口完成并创建一个新窗口。但是这个新窗口将代表
take(3)
的第三个值。这意味着
take
将从其来源取消订阅,并将发出完整的通知

因此,源将无法接收任何其他值,因此这应该可以解释为什么您只获得2个数组。

有趣的问题

因此,
windowTime(1000)
将每隔1000毫秒发出一个新窗口。但窗户到底是什么?一个窗口是
主题
实例

windowTime
可以管理多个窗口,但当您仅提供其第一个参数(称为
windowTimeSpan
)时,将只有一个活动窗口。这意味着在
windowTimeSpan
ms通过后,当前窗口将关闭,并创建一个新窗口并推送到流中

当窗口关闭时,表示它将发送完整通知。这是一个非常重要的方面

订阅时,将立即创建一个窗口,并将其推送到流中。
通过执行
flatMap(value=>value.pipe(toArray()))
,可以注册当前窗口(主题)的观察者。它在语义上与
subject.pipe(toArray()).subscribe(subscriber)

为什么会这样?
定时器(01100)
.烟斗(
//每1000毫秒发出一个值(窗口),并关闭(完成)上一个值
窗口时间(1000),
以(3)为例,
flatMap(value=>value.pipe(toArray()))
)
首先,让我们看看
flatMap
flatMap
mergeMap
相同。
mergeMap
所做的是管理内部可观察对象的数量(
concurrent
,默认为
INFINITY
)。正在跟踪一个内部可观察对象,直到它
完成

toArray
在源代码
完成之前积累值的作用是什么。在这种情况下,直到当前
主题
(窗口)
完成
。当窗口关闭时会发生这种情况,更具体地说,当
1000ms
pass时

因此,如前所述,订阅时将立即创建一个窗口。 在
0ms
之后输入一个值(0),在
100ms
之后输入另一个值(1),依此类推,直到值
9
输入。同时,
toArray
收集所有这些值。因此9的到来也标志着
1000ms
,也就是当前窗口将关闭的时间(将发出
完整通知
)。发生这种情况时,
toArray
将收到通知,并将收集的值发送给数据使用者

在此之后,将创建一个新窗口(第二个值为
take(3)
)。然后,值为10