【问题标题】:Angular Rxjs takeWhile operator occurs only onceAngular Rxjs takeWhile 运算符仅出现一次
【发布时间】:2021-12-09 12:27:13
【问题描述】:

我尝试继续延迟向服务器发送请求,但是当我放置控制台日志时,我看到它没有第二次发生。

这是我的代码:

this.siteStatusMessage.pipe(
      map(messageData => JSON.parse(JSON.stringify(messageData))),
      takeWhile(() => this.isAlive),
      delay(3000)
    ).subscribe();

我做错了什么?

【问题讨论】:

  • 显示更多代码。可观察到的 this.siteStatusMessage 是什么? isAlive 哪里改变了?

标签: angular rxjs


【解决方案1】:

据我了解,您尝试使用 delay(3000) 每 3 秒执行一次可观察对象。

delay 运算符,顾名思义,只是延迟通知的发送。因此,在您的示例中,observable 将只执行一次,但会比正常情况晚 3 秒发出通知。

要每 3 秒执行一次 observable,您需要使用 interval

interval(3000).pipe(
  switchMap((_) => this.siteStatusMessage.pipe(
      map(messageData => JSON.parse(JSON.stringify(messageData)))
  ),
  takeWhile(() => this.isAlive),
)

【讨论】:

    【解决方案2】:

    takeWhile 采用布尔值,您的功能似乎想使用 takeUntil(this.isAlive) 在这种情况下 isAlive 必须是一个主题/可观察的通知者。 要求比较模糊,请提供更多细节。

    【讨论】:

      【解决方案3】:

      由于您似乎希望每个请求延迟 3 秒并继续执行它们,直到您将 isAlive 标志设置为 false,所以您最好使用 interval 管道而不是 延迟

      我已经编写了一个脚本here 供您使用。在示例中,字符串将每 3 秒发出一次,直到标志变为 false。你只需要用你的替换 dummy observable。

      【讨论】:

        猜你喜欢
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-16
        • 2019-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多