从动态变化的数组中发射值
Emitting values from dynamically changing array
我需要对一个场景进行建模,在该场景中,我有一个随机获取新推送值或弹出的数字源数组。该数组用作计算源,应在最后一个完成后开始的循环中重复计算。每次数组更改时,都应丢弃以前的计算,以使用新值重新开始计算。
这是我的代码
let nums: number[] = []
const nums$ = new Subject()
timer(2000, 5000).pipe(
concatMap(n => of(n).pipe(delay(Math.random() * 1000)))
).subscribe(val => {
nums.push(val)
nums$.next(nums)
})
nums$.pipe(
switchMap(n => of(n).pipe(delay(1000)))
).subscribe(val => {
console.log(val)
nums$.next(nums)
})
第一个计时器应模拟对数组所做的更改,而第二个管道将计算表示为延迟。
我的解决方案有点脏,即使在 switchMap
中传递给 of
运算符的值未被识别为数组,所以我不知道如何利用 from
运算符。
与其使用 Subject
手动发出随机数并更新数组,我认为简单地使用 timer
生成随机数然后使用 scan
更简单将它们累积到一个数组中:
const nums$ = timer(0, 1500).pipe(
map(() => Math.ceil(Math.random() * 15)),
scan((array, num) => num > 10
? array.slice(0, -1) // remove last element (33%)
: array.concat(num) // add new element (67%)
, [])
);
然后,您可以将您的“计算值”(我们称它为 sum$
作为一个简单的例子)基于 nums$
:
const sum$ = nums$.pipe(
switchMap(numbers => doCalculation(numbers))
);
function doCalculation(numbers: number[]) {
return of(numbers.reduce((sum, num) => sum + num, 0)).pipe(delay(1000));
}
这是一个有效的 StackBlitz 演示。
the value passed to the of operator inside the switchMap isn't recognized as array
如果您在主题上指定类型,该类型将被正确识别:
const nums$ = new Subject<number[]>();
我需要对一个场景进行建模,在该场景中,我有一个随机获取新推送值或弹出的数字源数组。该数组用作计算源,应在最后一个完成后开始的循环中重复计算。每次数组更改时,都应丢弃以前的计算,以使用新值重新开始计算。
这是我的代码
let nums: number[] = []
const nums$ = new Subject()
timer(2000, 5000).pipe(
concatMap(n => of(n).pipe(delay(Math.random() * 1000)))
).subscribe(val => {
nums.push(val)
nums$.next(nums)
})
nums$.pipe(
switchMap(n => of(n).pipe(delay(1000)))
).subscribe(val => {
console.log(val)
nums$.next(nums)
})
第一个计时器应模拟对数组所做的更改,而第二个管道将计算表示为延迟。
我的解决方案有点脏,即使在 switchMap
中传递给 of
运算符的值未被识别为数组,所以我不知道如何利用 from
运算符。
与其使用 Subject
手动发出随机数并更新数组,我认为简单地使用 timer
生成随机数然后使用 scan
更简单将它们累积到一个数组中:
const nums$ = timer(0, 1500).pipe(
map(() => Math.ceil(Math.random() * 15)),
scan((array, num) => num > 10
? array.slice(0, -1) // remove last element (33%)
: array.concat(num) // add new element (67%)
, [])
);
然后,您可以将您的“计算值”(我们称它为 sum$
作为一个简单的例子)基于 nums$
:
const sum$ = nums$.pipe(
switchMap(numbers => doCalculation(numbers))
);
function doCalculation(numbers: number[]) {
return of(numbers.reduce((sum, num) => sum + num, 0)).pipe(delay(1000));
}
这是一个有效的 StackBlitz 演示。
the value passed to the of operator inside the switchMap isn't recognized as array
如果您在主题上指定类型,该类型将被正确识别:
const nums$ = new Subject<number[]>();