javascript - RxJS 5, Angular : How to do a request every x seconds UNTIL a message matches a certain string?

标签 javascript angular rxjs

Web-dev 和 Angular 的新手。 这是我当前的代码。现在,它所做的只是每 2 秒调用一次 http 请求并在控制台记录消息。 我想要的是,如果消息与字符串“5”匹配,让它取消订阅。另外,我如何将其设为非嵌套订阅? (嵌套订阅是一种不好的做法吗?)。目前,我正在使用 Angular 5 和 rxjs 5。

public checkProgress() {
   Observable
      .interval(2000)
      .subscribe(
        x => {
          this.myService.getStatus()
            .subscribe( data => console.log(data));
        }
      );
  }

此外,如果用户导航到不同的组件,我该如何取消订阅? ngOnDestroy?

最佳答案

有多种方法可以做到这一点。选择:

递归 - 一个三元运算符

expand(val => val === "5" ? this.myService.getStatus().pipe(delay(2000)) : empty())

使用takeWhile 递归

expand(() => this.myService.getStatus().pipe(delay(2000)))
    .pipe(takeWhile(val => val !== "5"))

间隔 takeWhile

timer(0, 2000)
    .pipe(
        switchMap(() => this.myService.getStatus()),
        takeWhile(val => val !== "5")
    )

关于javascript - RxJS 5, Angular : How to do a request every x seconds UNTIL a message matches a certain string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53037070/

相关文章:

javascript - 忽略落在 :before part of header element (jQuery) 上的点击

javascript - 尝试从 iframe 中获取选择值

javascript - 如何以更简洁的方式编写嵌套订阅?

angular - 使用 Observables 在 Angular 中一个接一个地调用两个服务

javascript - 创建 hasMany 关联的元素

angular - 软件包不适用于 Angular 生产构建

Angular Router导航和重新加载需要渲染组件一次但渲染两次

Angular 传递将数据解析为子路由

Angular 订阅不会触发

javascript - 高速 Javascript 基准测试