问题描述
我正在尝试将两个 Observable 组合起来,以便为接受两个值的服务方法的调用提供很少的值。但在这里我几乎没有错误
-
'([filter,sort]: [string,string]) => void' 类型的参数不可分配给'(value: [string,string],index: number) 类型的参数 =>可观察输入'。 类型“void”不可分配给类型“ObservableInput”。
-
在控制台 -
您在需要流的地方提供了“未定义”。您可以提供 Observable、Promise、Array 或 Iterable。 在 subscribeto (subscribeto.js:27) 在innerSubscribe (innerSubscribe.js:71) 在 SwitchMapSubscriber._innerSub (switchMap.js:44) 在 SwitchMapSubscriber._next (switchMap.js:34) 在 SwitchMapSubscriber.next (Subscriber.js:49) 在 CombineLatestSubscriber.notifyNext (combineLatest.js:73) 在 InnerSubscriber._next (InnerSubscriber.js:11) 在 InnerSubscriber.next (Subscriber.js:49) 在 BehaviorSubject._subscribe (BehaviorSubject.js:14) 在 BehaviorSubject._trySubscribe (Observable.js:42)
-
定义可观察对象和主题。
private openSortQuerySubject: BehaviorSubject<string> = new BehaviorSubject<string>(this.formatSortQuery(this.multiSortMeta)); public openSortQuery: Observable<string> = this.openSortQuerySubject.asObservable(); private closedSortQuerySubject: BehaviorSubject<string> = new BehaviorSubject<string>(this.formatSortQuery(this.multiSortMeta)); public closedSortQuery = this.closedSortQuerySubject.asObservable();
-
组合观察。
const openQueries$ = combineLatest([this.openFilterQuery,this.openSortQuery]); const closedQueries$ = combineLatest([this.closedFilterQuery,this.closedSortQuery]);
-
在服务方法中使用合并值。
openQueries$
.pipe(
switchMap(([filter,sort]) => {
this.alertService
.listAlerts(filter,sort);
}),tap(v => console.log(v))
)
.subscribe((openAlerts) => {
this.openAlertsCount = openAlerts.length;
this.openAlerts = this.parseAlerts(openAlerts);
});
closedQueries$
.pipe(
switchMap(([filter,sort);
})
)
.subscribe((closeDalerts) => {
this.closeDalertsCount = closeDalerts.length;
this.closeDalerts = this.parseAlerts(closeDalerts);
});
解决方法
您必须在 switchMap
回调中返回一个 observable(或 RxJS 知道如何将其转换为 observable 的东西)。
不是这个:
switchMap(([filter,sort]) => {
this.alertService.listAlerts(filter,sort);
})
但是这个(假设 listAlerts
返回一个 observable、promise 或类似的):
switchMap(([filter,sort]) => {
return this.alertService.listAlerts(filter,sort);
})