我正在尝试将Observable.interval()
与.flatMap()
联系起来,但我(我认为是)是一种意想不到的行为。
这是我正在使用的代码(使用Angular 2):
Observable.interval(1500)
.scan( (numArr:any[],curr:any,i:number) => {
numArr.push(i);
return numArr;
}, [])
.do(arr => console.log('interval value', arr))
.flatMap(numArr => {
return Observable.interval(500)
.map(i => {
numArr.forEach((el, i, arr) => {
arr[i] += 1;
})
return numArr;
})
}).subscribe(res => console.log('final value', res));
我得到的结果是
interval value [0]
final value [1]
final value [2]
interval value [2, 1]
final value [3, 2]
final value [4, 3]
final value [5, 4]
final value [6, 5]
final value [7, 6]
interval value [7, 6, 2]
final value [8, 7, 3]
final value [9, 8, 4]
final value [10, 9, 5]
....
我希望在每个“间隔值”周期之间收到3个值,而不是每次间隔发出一个值时我得到一个更大的列表...为什么会发生这种情况?我怎么能避免这种情况行为?
我想要实现的是增加 1 每个500ms的第一个Observable.interval()
发出的数组的每个值。
换句话说,我期望的是:
interval value [0]
final value [1]
final value [2]
final value [3]
interval value [3, 1]
final value [4, 2]
final value [5, 3]
final value [6, 4]
interval value [6, 4, 1]
final value [7, 5, 2]
final value [8, 6, 3]
final value [9, 7, 4]
....
希望你能提供帮助,谢谢。
答案 0 :(得分:0)
有趣的问题。我不知道我是否完全理解你在这里想要做什么(当你在flatMap中改变原始阵列的时候还有很多事情发生)但是这就是我所在的地方会离开这里:
你在flatMap内创建的observ不会终止 - 它会继续增加numArr中的值,即使另一个间隔值已经进入。这意味着在2个间隔值进入之后你实际上增加了numArr中的所有值,每次500 ms,经过3个间隔值三次,依此类推。 您想要的是(将所有值增加三次,然后向数组添加另一个值,在这种情况下每个500ms,并重复)可以通过将flatMap中的Observable限制为带有.take(3)的三个循环来实现。
你可以通过使用concatMap而不是flatMap来获得相同的期望行为,因为它连续(一个observable当时运行,下一个只在前一个完成时开始)内部创建的observable而不是合并它们(所有Observables运行于同一时间)。不是说你应该这样做:D,选择take(3)。
答案 1 :(得分:0)
第二个flatMap()
应该转换为switchMap()
,因此间隔可观测对象将不会处于待处理状态。