【问题标题】:Rxjs repeat call until a value is foundRxjs 重复调用直到找到一个值
【发布时间】:2020-04-10 01:29:35
【问题描述】:

在 Angular 8 中,我有一个方法需要不断重复,直到我从服务器收到特定的成功消息。

在我的 webapi 方法中,它有一个 ping 另一台服务器的调用,另一台服务器发回一个 api 密钥。我需要一直调用这个方法,直到生成一个 api 密钥并最终发回。这是重试间隔的需要。

我的问题是响应 == 成功调用从未命中。

     return new Promise((resolve, reject) => {
        this.http.get<any>(url)
        pipe(
        map(response => {
          if(response == 'Success'){   <--- Not getting hit.
              resolve(true);
          }
        }),
        timeout(500),           
        retry(),
        delay(1500),
        repeat());
    })

【问题讨论】:

  • 你能解释一下你想要完成的主要任务是什么吗?
  • 抱歉更新了详情

标签: angular rxjs


【解决方案1】:

不确定您的主要任务,但绝对可以帮助您解决代码中的问题。

  1. 我认为您在这里不需要承诺。您可以在没有它们的情况下开发代码。
  2. 您需要订阅 observable 才能从 observable 发出值。
  3. 您需要使用点击运算符而不是地图运算符,因为您需要检查值的存在

    this.http.get<any>(url)
    pipe(
    tap(response => {
      if(response == 'Success'){   <--- Not getting hit.
        alert('successful data')
      }
    }),
    timeout(500),           
    retry(),
    delay(1500),
    repeat()).subscribe(x => console.log(x));
    })  
    

【讨论】:

  • 我已经使用过它并且它有效...可以对 if 条件之后调用的所有方法(超时、重试、延迟、重复等...)进行解释帮助他人理解概念,而不仅仅是复制和粘贴!谢谢:)
  • 对于这个代码。成功时如何停止重复,并调用下一个请求/流?
【解决方案2】:

如果您结帐here,我想您会找到答案。我认为这符合您的问题。

return new Promise((resolve, reject) => {
  this.http.get<any>(url).pipe(
    tap(response => {
      if(response == 'Success'){   <--- Not getting hit.
        resolve(true);
      } else {
        // will be catch on retryWhen
        throw 'ERROR';
      }
    }),
    // if any errors, wait 1.5s and try again
    retryWhen(errors => errors.pipe(delayWhen(_ => timer(1500)))
  ).subscribe();
});

【讨论】:

    猜你喜欢
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多