【发布时间】:2019-03-08 19:34:50
【问题描述】:
我有一个场景,我必须控制多个 PTZ 摄像头来分别拍摄多个角度的照片。因此,例如:Camera A 将采用角度 A1、A2、A3Camera B 将采用角度 B1、B2、B3、B4
将相机移动到正确的角度,捕获图像并上传图像,这些都是返回承诺的异步函数。moveCamera( angle )captureImage()uploadImage()
相机必须并行操作,但每个相机拍摄的角度必须按顺序完成。
不知何故,我觉得这可以通过 RxJS 轻松解决,但我正在努力将它们拼凑在一起。我能做到的最好的事情是类似于下面的解决方案,它以某种方式使相机彼此按顺序处理。请注意,我使用 redux-observable,下面的代码是 plain RxJS 中最好的代码。请原谅我的 RxJS。
const angles = {
'Camera A': [ 'A1', 'A2', 'A3' ],
'Camera B': [ 'B1', 'B2', 'B3', 'B4' ],
}
const cameras = of( [ 'Camera A', 'Camera B' ] );
const cameraRun = cameras.pipe(
mergeMap( camera => {
// in redux-observable, I could return an array here
return of( angles[ camera ] );
} )
);
cameraRun.pipe(
concatMap( angle => {
return moveCamera( angle )
.then( () => captureImage() )
.then( () => uploadImage() )
.then( () => console.log( 'Image success' ) );
} )
)
对于知道 redux-observable 的人,我有 3 个史诗:RUN_CAMERA_SET_ROUTINE - 在 mergeMap 内运行所有摄像机RUN_CAMERA_ROUTINE - 在 mergeMap 内运行每个摄像机的所有角度CAPTURE_IMAGE - 在concatMap 中运行上面的异步函数
我最初的想法是CAPTURE_IMAGE 将由于mergeMap 产生流而被“分组”,但我错了。看来CAPTURE_IMAGE 仍然是一个流,所有摄像机的每个角度都在排队。
任何指针都会很有帮助。
【问题讨论】:
标签: rxjs redux-observable