javascript - 发送 API 调用,观察一个特定的值,如果值发生变化,再次调用
问题描述
我有一个调用客户端并获取数据并返回它的函数:
const remoteConnection = await
this.client.connectionStatus(chassi, number, language) || [];
return {
data: remoteConnection as RemoteInfo,
read: new Date()
};
响应将采用以下形式:
{
connectionStatus: "",
online: ""
}
connectionStatus 可以有三种状态:
'disconnected'
'pending'
'connected'
我想调用我的 API 并发送数据。如果“connectionStatus”为“待处理”,我想每 5 秒调用一次 API 以检查它是否更改为“已连接”。在这种情况下,我想用新值再次返回数据。
简而言之:
进行 API 调用并返回数据。如果返回数据中的 'connectionStatus' 等于 'pending',则每 5s 进行一次新调用以检查 'connectionStatus' 是否等于 'connected'。如果为真,则再次返回数据。
怎么做?
解决方案
您可以使用timer
触发进行 api 调用,并takeUntil
在状态满足您的条件时使用停止:
const data$ = timer(0, 5000).pipe(
concatMap(() => client.connectionStatus()),
takeWhile(resp => resp.connectionStatus === 'pending', true),
map(data => ({ data, read: new Date() }))
);
这是流程:
timer
立即发射,然后每 5 秒发射一次concatMap
调用你的方法并发出 promise 的结果takeWhile
满足条件时导致流完成map
只需将RemoteInfo
响应转换为您想要的形状
只需订阅此 observable 即可触发执行并接收排放:
data$.subscribe();
这是StackBlitz示例。
如果 observable 将有多个订阅者,您可能希望通过利用操作符来防止多次单独调用您的 api share
,这将导致所有订阅者共享相同的订阅:
const data$ = timer(0, 5000).pipe(
concatMap(() => client.connectionStatus()),
takeWhile(resp => resp.connectionStatus === 'pending', true),
map(data => ({ data, read: new Date() })),
share() // <---
);