我正在处理一些旧代码,但设备状态更新错误有一个问题。问题是,旧的旧版状态更新是使用长轮询完成的,并且BE上存在并发问题,该问题不会得到解决(不推荐使用BE)。有时它忘记更新状态。消息到达,但不正确。
我可以从新的BE中检索请求它的正确状态(该应用程序现在是令人讨厌的混合动力),但我无法正确执行。我的第一个想法是使用whitLatestFrom
,但由于明显的原因而无法使用。
legacyService.getState<LegacyState>()
.pipe(
subscribeon(queue),withLatestFrom(this.realService.getRealStatus()),// request to the new BE
map(([legacy,real]) => {
// This if statement is a must. getRealStatus() returns only partial state,not the whole DeviceState
// If there is a difference in the state from two sources,I create a new object with correct state
if (legacy.state === DeviceState.INITIALIZED && !real.stable) {
return new LegacyState(
legacy.instrument,legacy.db,DeviceState.UNSTABLE,);
}
return event; // states are same,returning state from legacy source
})
)
.subscribe(event => {
this._deviceStateUpdated$.next(event);
});
可以在应用重新启动/重新加载时使用,但是以后real
状态不会更新,因为不会进行任何新调用,它只会返回以前的值。 combineLatest
也会发生同样的情况。第一个(来自轮询)已更新,第二个仅返回先前的值。
问题是:我如何以这样的方式组合两个可观察对象,即在更新第一个可观察对象时,我也强制更新第二个可观察对象的新值?当然,我能够处理它们两者,因为第二个可观察对象仅返回部分状态。我尝试了多张地图(swtichMap,concatMap,...
),但没有成功。