【问题标题】:Angular stop making api request after given milliseconds even if it's not succeededAngular 在给定毫秒后停止发出 api 请求,即使它没有成功
【发布时间】:2021-12-19 16:05:21
【问题描述】:

我正在尝试从后端获取状态,直到满足条件,但我不想通过永远发出请求来使服务器过载:)。我想在一分钟后停止发出请求。 这是代码

  this.statusService
.getStatus(this.itemId).pipe(
repeatWhen(obs => obs.pipe(delay(500))),
filter(data => {
  if(data.status === 'done'){
    return true;
  }else{
    return false;
  }
   }),
take(1)
).subscribe(result =>{
  console.log(‘done')
});

我尝试了 timeout() 但它并没有停止发出请求

  this.statusService
.getStatus(this.itemId).pipe(
 timeout(60000),
repeatWhen(obs => obs.pipe(delay(500))),
filter(data => {
  if(data.status === 'done'){
    return true;
  }else{
    return false;
  }
   }),
take(1)
).subscribe(result =>{
  console.log(‘done')
});

【问题讨论】:

  • 您的超时当前设置为 1m 和 40 秒。一分钟你需要输入 timeout(60000)
  • @Jahrenski 我认为这不是解决方案,但我更新了 :) 谢谢

标签: javascript angular typescript rxjs


【解决方案1】:

更新:

一个简单的解决方案可以是:

const apiCall$ = this.statusService.getStatus(this.itemId)
  .pipe(
    delay(1000),
    repeat(),
    filter(data => (data.status === 'done'))
  );

const timeout$ = of(false).pipe(delay(3000));

// The observable to emit first is used
race([apiCall$, timeout$])
  .pipe(take(1))
  .subscribe(result => {
    console.log(result);
  });

【讨论】:

  • 在这种情况下,每个请求之间不会有延迟
  • 把延迟运算符放在最上面,我更新了我的帖子,你可以试试。
  • 谢谢它的工作。是否可以在一分钟后不满足条件时触发消息?
  • 您的意思是在订阅函数中获取一个值?有什么价值?
  • 是的订阅功能。我的意思是,如果状态在一分钟内“完成”,我将显示成功消息,否则我想显示错误消息,例如“请稍后再试”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
相关资源
最近更新 更多