当前位置: 首页 > 知识库问答 >
问题:

组合CombineTest和switchMap时未定义

夏意蕴
2023-03-14

我试图将两个可观察对象组合起来,使接受两个值的调用服务方法具有几个值。但这里我有一些错误

>

控制台中-

您在需要流的位置提供了“未定义”。您可以提供一个可观察的、promise的、数组的或可观察的。在SwitchMapSubscriber的innerSubscribe(innerSubscribe.js:71)的subscribeTo(subscribeTo.js:27)_SwitchMapSubscriber上的innerSub(switchMap.js:44)_接下来(switchMap.js:34)在SwitchMapSubscriber上。下一个(Subscriber.js:49)在CombineLatestSubscriber。InnerSubscriber上的notifyNext(combineLatest.js:73)_下一步(InnerSubscriber.js:11)在InnerSubscriber。下一步(Subscriber.js:49)在BehaviorSubject_在BehaviorSubject订阅(BehaviorSubject.js:14)_trySubscribe(observeable.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]) => {
              this.alertService
                .listAlerts(filter, sort);
            })
          )
          .subscribe((closedAlerts) => {
            this.closedAlertsCount = closedAlerts.length;
            this.closedAlerts = this.parseAlerts(closedAlerts);
          });
    
  • 共有1个答案

    杜阳炎
    2023-03-14

    您必须在switchMap回调中返回一个可观察对象(或者RxJS知道如何将其转换为可观察对象)。

    不是这个:

    switchMap(([filter, sort]) => {
      this.alertService.listAlerts(filter, sort);
    })
    

    但是这(假设listAlerts返回一个可观察的、promise的或类似的):

    switchMap(([filter, sort]) => {
      return this.alertService.listAlerts(filter, sort);
    })
    
     类似资料:
    • switchMap 函数签名: switchMap(project: function: Observable, resultSelector: function(outerValue, innerValue, outerIndex, innerIndex): any): Observable 映射成 observable,完成前一个内部 observable,发出值。 如果你想要维护多个内部 s

    • 有人,请解释一下SwitchMap和FlatMap在Javascript方面的区别(在角度透视图中,rxjs 5) 以我的理解。 SwitchMap仅发出最新的可观察值,并取消先前的可观察值。 flatMap收集所有单独的可观测数据,并在单个数组中返回所有可观测数据,而不关心可观测数据的顺序。异步工作。 concatMap保持秩序并发出所有可观察值,同步工作 是这样吗? mergeMap与上面的工

    • 运算符在可观察的末尾发出值(完成时)。 我正在寻找一种在中使用的方法。当外部可观察对象发出值或完成时,我想要无限内部可观察值的。 此图说明了想要的行为:

    • 我有一个组件调用我的服务,如下所示: authservice调用如下所示: 这导致http帖子永远不会被触发,并立即与上面的图像发生错误。如果我删除了switchMap,只返回服务中的可观察值,然后在组件中订阅它,则调用成功。 我错过了什么吗?我对rxjs相对较新,所以我不确定我是否误解了什么,但任何帮助都将不胜感激。 编辑:我还能够将switchMap移动到组件中,做我需要的事情,然后在最后调用

    • 我正在寻找以下问题的答案。 给定一组整数(无重复项)和一个和,找出集合元素的所有可能组合,并求和。解的顺序并不重要(解{2,2,3}和{3,2,2}是相等的)。 请注意,最终组合不需要是集合,因为它可以包含重复。 示例:集合{2,3,5}和10 结果:{2, 2, 2, 2, 2},{2,2,3,3},{2,3,5},{5,5} 我已经研究过子集和问题以及硬币兑换问题,但不能使它们适应我的需要。我

    • 我有一个包含以下列的表格: 表在在线数据库中。我使用dataset.xsd文件和连接字符串在客户端和在线数据库之间进行通信。 以下是我使用的一些方法: