Javascript rxjs根据响应中指定的持续时间重复api调用 上下文

Javascript rxjs根据响应中指定的持续时间重复api调用 上下文,javascript,rxjs,Javascript,Rxjs,我需要从具有变量过期(在响应中指定)的服务器获取数据。一旦过期,我需要再拿一次。因此,我想创建一个流,该流发出一个异步请求,并在该请求的响应中指定的时间之后重复该请求 我试过的 这是我的第一次尝试,但当无法访问最后一个响应时,会重复。我不希望每1000毫秒重复一次,而是希望根据响应的expiration属性进行重复 const{Observable,defer,of}=rxjs; const{repeatWhen,delay,map,take}=rxjs.operators; 让计数=0; 函

我需要从具有变量过期(在响应中指定)的服务器获取数据。一旦过期,我需要再拿一次。因此,我想创建一个流,该流发出一个异步请求,并在该请求的响应中指定的时间之后重复该请求

我试过的 这是我的第一次尝试,但当
无法访问最后一个响应时,
会重复。我不希望每1000毫秒重复一次,而是希望根据响应的expiration属性进行重复

const{Observable,defer,of}=rxjs;
const{repeatWhen,delay,map,take}=rxjs.operators;
让计数=0;
函数api(){
返回({data:count++,过期时间:Math.random()*1000});
}
延迟(()=>api()).pipe(
repeatWhen((通知)=>notification.pipe(延迟(1000)),
map((response)=>response.data),
采取(5)
).subscribe((x)=>{console.log(x);})

我不确定我是否完全理解了你的问题,但是像这样的问题呢

function api() {
  return of(Math.random() * 10000);
}

defer(() => api()).pipe(
    tap(delay => console.log('delay', delay)),
    switchMap(data => interval(data)),
    take(5)
).subscribe(console.log);
评论后更新的答案

您已经在根据api返回给您的内容进行重复,而不是每1000毫秒重复一次。如果您运行此代码,应该很清楚

let count = 0;
const expiration = Math.random() * 1000;

function api() {
    return of({ count, expiration});
}

defer(() => api()).pipe(
    tap(delay => console.log('delay', delay.expiration)),
    switchMap(data => interval(data.expiration).pipe(map(() => data))),
    map(data => ({expiration: data.expiration, count: count++})),
    take(5)
).subscribe(console.log);
第二次评论后的第二次更新

如果我现在明白了你想要实现的目标,这应该会对你有所帮助

defer(() => api()).pipe(
    tap(data => console.log('I do something with this data', data)),
    switchMap(data => interval(data.expiration)),
    switchMap(() => api()),
    take(5)
).subscribe(data => console.log('I do something with this data', data));

这可以使用
.expand()
运算符轻松实现,该运算符用于递归目的。精确的解决方案只有几行:

api()
    .expand(({expiration}) => api().delay(expiration))
    .take(5)
    .subscribe(x=>console.log(x));

下面是。

下一票是否需要评论?为什么不使用web套接字?“那不是很好而且很有效吗?”Mohamadhasham说,那真的只是把问题向下推了一层。我必须在某个地方有个计时器。谢谢你的回复。我将修改它以澄清一些问题。我仍然需要从api返回的数据流过流。我只需要根据数据的一个属性获取新数据。它看起来只会命中api一次,然后每隔一段时间重复一次响应。我想要的是在响应后的超时时间调用api,然后继续递归地执行。感谢另一次更新,但想法是让每个请求间隔基于最后一个请求,而不是所有请求间隔基于第一个请求。我真的很感谢你的努力,但我认为CozyAzure提到的
扩展
操作符满足了我的要求。哇,谢谢!老实说,我从未遇到过那个接线员。我最终在api前面使用了一个计时器,这样它就可以在到期后而不是到期前调用api<代码>展开({expiration})=>timer(expiration).pipe(开关映射(()=>api()))