【问题标题】:concatMap is not subscribing for the second timeconcatMap 没有第二次订阅
【发布时间】:2022-01-21 04:05:20
【问题描述】:

我正在实现 concatMap 运算符。甚至在此之前,我尝试一个接一个地进行两个订阅,并且成功了。第一次订阅是针对表单的输入字段进行的,第二次订阅是针对 http 请求的。下面是代码:

// AfterViewInit implementation
// this.form is a formGroup with formControl city

  ngAfterViewInit() {
    this.form.valueChanges.pipe(
      map (val=>val.city),
    ).subscribe(
      val => {this.request(val)}
    );
  }

   request(city){
    this.httpClient.get(url, {params:{
    ...
    }}).subscribe(
      value => {

      }, error => {}
    );
  }

上面的 sn-p 将在每次输入字段更新时进行 http 调用。我通过添加 concatMap 对 ngAfterViewInit 进行了如下修改:

  ngAfterViewInit() {
    this.form.valueChanges.pipe(
      concatMap(val=> this.request(val.city)),
    ).subscribe();
  }

现在,请求未按预期发出。当输入更改时,第一次请求只发出一次。永远不会为更新的输入字段发出第二个请求。我在这里做错了什么?

【问题讨论】:

    标签: angular rxjs concatmap


    【解决方案1】:

    尝试像这样修复请求功能:

    request(city){
        return this.httpClient.get(url, {params:{
        ...
        }}).pipe(tap(
          value => {
    
          }, error => {}
        ));
      }
    

    通过此修复,所有链中将只有一个 subscribe 调用,并且运算符将按预期工作。

    【讨论】:

    • 修复了问题。问题是我从函数“请求”返回的类型必须是可观察的。所以,我在返回类型上使用了 'of' 运算符,它解决了这个问题。
    猜你喜欢
    • 2019-01-26
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 2019-08-10
    • 2021-03-17
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多