以下代码按预期工作(请参见输出):
import { Observable, Subject } from "rxjs";
import { scan } from "rxjs/operators";
export type ColumnFilter = { field: string, value: string };
let sub$: Subject<ColumnFilter> = new Subject<ColumnFilter>();
let obs$: Observable<ColumnFilter[]> = new Observable<ColumnFilter[]>();
obs$ = sub$.pipe(
scan((acc: ColumnFilter[], curr) => {
const index = acc.findIndex(f => f.field === curr.field);
if (index === -1) {
acc.push({ field: curr.field, value: curr.value });
return acc;
}
curr.value === '' ?
acc.splice(index, 1) :
acc[index] = { field: curr.field, value: curr.value };
return acc;
}, [])
);
obs$.subscribe(
value => console.log(value)
);
sub$.next({ field: 'size', value: 'xl' })
sub$.next({ field: 'color', value: 'black' })
sub$.next({ field: 'color', value: '' })
// output:
// [ { field: 'size', value: 'xl' } ]
// [ { field: 'size', value: 'xl' }, { field: 'color', value: 'black' } ]
// [ { field: 'size', value: 'xl' } ]
现在,如果我向obs$
个可观察对象添加第二个订阅,输出将更改:(判断流的最后一个值.它现在包含{ field: 'color', value: '' }
个)
import { Observable, Subject } from "rxjs";
import { scan } from "rxjs/operators";
export type ColumnFilter = { field: string, value: string };
let sub$: Subject<ColumnFilter> = new Subject<ColumnFilter>();
let obs$: Observable<ColumnFilter[]> = new Observable<ColumnFilter[]>();
obs$ = sub$.pipe(
scan((acc: ColumnFilter[], curr) => {
const index = acc.findIndex(f => f.field === curr.field);
if (index === -1) {
acc.push({ field: curr.field, value: curr.value });
return acc;
}
curr.value === '' ?
acc.splice(index, 1) :
acc[index] = { field: curr.field, value: curr.value };
return acc;
}, [])
);
// vvv this was added
obs$.subscribe()
// ^^^ this was added
obs$.subscribe(
value => console.log(value)
);
sub$.next({ field: 'size', value: 'xl' })
sub$.next({ field: 'color', value: 'black' })
sub$.next({ field: 'color', value: '' })
// output:
// [ { field: 'size', value: 'xl' } ]
// [ { field: 'size', value: 'xl' }, { field: 'color', value: 'black' } ]
// [ { field: 'size', value: 'xl' }, { field: 'color', value: '' } ]
我不明白为什么第二次订阅会改变流的结果.我只能猜测这与变异累加器有关?因为如果我使用acc.filter
而不是acc.splice
,它就会像预期的那样工作.
Edit个
增加了一个堆叠闪电战:https://stackblitz.com/edit/rxjs-6-opeartors-uzojgw?file=index.ts