【发布时间】:2019-02-14 02:22:00
【问题描述】:
我将 NGRX 和 Effects 用于应用程序中的基本内容。该应用程序进行蓝牙文件通信并不断刷新/写入各种参数。 但有时需要暂停刷新。
我在暂停执行使用 concatMap 将操作排队到串行队列中的 NGRX 效果时遇到问题。在给出某种“继续”信号或 bluetoothService.paused 属性再次变为 false 后,仍应处理排队的操作。 concatMap 中可以有许多 ReadFromDevice 操作排队。
蓝牙服务有一个布尔属性this.bluetoothService.pauseCommunication,但是我不知道如何将它集成到效果中。我尝试了各种(可能是愚蠢的)事情,但到目前为止都失败了。不幸的是,我目前无法更改 bluetoothService 代码。
我知道我可以通过抛出错误来取消完整的 concatMap,但这不是我需要的。我只需要暂停处理,直到布尔标志变为 false。
这是我正在使用的简化示例效果
@Effect()
readParameterFromDevice$: Observable<Action> = this.actions$.pipe(
ofType<ReadFromDevice>(CommunicationActionTypes.ReadFromDevice),
map(action => action.payload),
concatMap(async request => {
try {
const result = await this.bluetoothService.readFromDevice(
request
);
return new ReadSuccess({
result
});
} catch (error) {
return new ReadError({
result
});
}
})
);
如果有人能指出我正确的方向,那就太好了。
【问题讨论】:
-
谢谢!但是,如果我没记错的话,这解决了一个不同的问题。我认为这种方法可以阻止操作达到我的 readParameterFromDevice$ 效果,但它不会暂停已经由 concatMap 排队的操作,还是会?
-
从哪里获得控制是否要处理队列中的另一个项目的布尔标志?
-
在上面的示例中,布尔标志将在 this.bluetoothService.paused 上可用
-
如果
this.bluetoothService.paused是一个 Observable 会更容易。