【发布时间】:2018-08-22 16:54:23
【问题描述】:
使用 redux-observable,我试图从单个史诗中产生多个 WORK 动作,如下所示:
( action$, state$ ) => {
return action$.pipe(
ofType( 'SPAWN' ),
flatMap( action => {
return [
{ type: 'WORK', payload: 'a' },
{ type: 'WORK', payload: 'b' },
{ type: 'WORK', payload: 'c' },
];
} )
)
}
动作触发良好,但问题是,这些 WORK 动作是异步的,因此它们由另一个史诗处理,如下所示:
( action$, state$ ) => {
return action$.pipe(
ofType( 'WORK' ),
flatMap( action => {
const promise = new Promise( resolve => {
setTimeout( () => {
resolve( { type: 'SET', payload: action.payload } );
}, Math.random() * 5000 ); // promise may resolve at different times
} );
return promise;
} )
)
}
在reducer for action SET,我希望,不管上面setTimeout 的随机性如何,序列都是有序的,因为flatMap 正在返回promise。结果应该是这样的:
a
b
c
尽管如此,我得到了 SET 操作的随机排序,例如:
b
c
a
如果有人能指出正确的方向并帮助我理解,我将不胜感激。
工作更新
根据@Oles Savluk 的回答,我将WORK 史诗编辑为如下:
( action$, state$ ) => {
return action$.pipe(
ofType( 'WORK' ),
concatMap( action => {
const promise = new Promise( resolve => {
setTimeout( () => {
resolve( { type: 'SET', payload: action.payload } );
}, Math.random() * 5000 ); // promise may resolve at different times
} );
return promise;
} )
)
}
注意concatMap 的使用使得WORK 类型的动作按顺序排列在流中。一个动作在执行之前等待另一个动作完成。
【问题讨论】:
标签: angular rxjs observable ngrx redux-observable