Javascript 缓冲concat映射输入

Javascript 缓冲concat映射输入,javascript,redux,react-redux,rxjs,redux-observable,Javascript,Redux,React Redux,Rxjs,Redux Observable,我试图找到一种方法,如何在前一个可观察对象完成之前,缓冲concatMap输入上的数据 最好用我的真实例子来解释 我有一个使用redux observable的应用程序 有一个动作validate const validate=updateDataId=>({ 类型:验证, 有效负载:{UpdatedDataId}, }); 我想缓冲UpdateDataids数组,并减少对longTimePostAjaxFunction的调用 export const validatePIC=(action$

我试图找到一种方法,如何在前一个可观察对象完成之前,缓冲concatMap输入上的数据

最好用我的真实例子来解释

我有一个使用redux observable的应用程序

有一个动作
validate

const validate=updateDataId=>({
类型:验证,
有效负载:{UpdatedDataId},
});
我想缓冲UpdateDataids数组,并减少对
longTimePostAjaxFunction
的调用

export const validatePIC=(action$,state$,{longtimepastaxfunction})=>
动作$.pipe(
类型(验证),
映射({payload:{updatedDataId}})=>updatedDataPointId),
//我想在这里缓冲longtimepostajax函数,直到前一个可观察对象(longtimepostajax函数)完成
地图(展平),
concatMap(更新的数据ID=>
longtimepostajax函数('validate/url'{
更新的数据ID,
}).烟斗(
地图(已填充),
),
),
);

你知道我该如何解决这个问题吗?

解决问题的一种方法是每次
longtimepostajax函数
解决时都会发出一个流。例如(尽管可能有更好的选择),您可以在
action$.pipe(ofType('READY\u For_id')
上缓冲id流,并将READY操作平铺到AJAX结果流中

export const validateEpic = (action$, state$, { longTimePostAjaxFunction }) =>
  action$.pipe(
    ofType(VALIDATE),
    map(({ payload: { updatedDataIds } }) => updatedDatapointIds),
    buffer(action$.pipe(ofType('READY_FOR_IDS')),
    map(flatten),
    concatMap(updatedDataIds =>
      longTimePostAjaxFunction('validate/url', {
        updatedDataIds,
      }).pipe(
        map(validateFulfilled)
      ),
    ),
    concatMap(action => [action, { type: 'READY_FOR_IDS' }])
  );
我目前(糟糕)的解决方案是:

缓冲区:

。。
映射({payload:{updatedDataId}})=>updatedDataId),
缓冲区(操作$.pipe(类型为(验证\启动)),
地图(展平),
..    
缓冲逻辑:

export const pendingValidate=action$=>
合并映射(()=>
动作$.pipe(
类型(验证,验证完成),
映射(({type})=>type),
扫描(
([gate],currentAction)=>{
如果(currentAction==验证){
如果(门=='open')返回['closed',true];
返回['waiting',false];
}
如果(门=='waiting'&¤tAction===验证已完成){
返回['closed',true];
}
返回['open',false];
},
['open',false],
),
过滤器(([,shouldValidate])=>shouldValidate),
映射(()=>({type:VALIDATION\u START})),
),
),
);

因此,假设发出了
X
,并且
longtimepostaxfunction
将使用
X
作为参数。同时,如果发出了
Y,Z,W
,但上一个
longTimePostAjaxFunction
尚未完成,则需要缓冲
Y,Z,W
,以便下一个
longTimePostAjaxFunction
调用将具有
Y,Z,W
。我做对了吗?不太清楚你想要达到什么目标,但也许可以试试
zip
?它返回所提供的某种类型的数据对observables@AndreiGătej是的,你是right@cuddlemeister我只有一个可观察的,但在上一个完成之前,
concatMap
不会订阅下一个输入。我不明白。你能写一个例子吗?
concatMap
会缓冲源的排放,直到内部观测完成。但是很难说你想要什么行为。问题是你只想在发出某种类型为
validate
的操作时进行验证。我发布了我当前的解决方案来解释我不确定我是否看到了问题。我上面显示的行为仅由
VALIDATE
操作触发。