Rxjs 对单个事件执行多个操作

Rxjs 对单个事件执行多个操作,rxjs,Rxjs,尝试使用初始事件数据创建触发多个开关映射的事件 每个操作都会创建一个转换承诺,然后将其写入文件系统。这些操作是独立的和不相关的,但是使用相同的数据,只是为了不同的目的,所以它们不应该合并 当前使用taps而不是switchMap,这可能导致多个事件同时运行 const SomeApiCall = () => {return {some: 'data'} } const AllowsDoAction = () => {console.log('Parsing API and writt

尝试使用初始事件数据创建触发多个开关映射的事件

每个操作都会创建一个转换承诺,然后将其写入文件系统。这些操作是独立的和不相关的,但是使用相同的数据,只是为了不同的目的,所以它们不应该合并

当前使用taps而不是switchMap,这可能导致多个事件同时运行

const SomeApiCall = () => {return {some: 'data'} }
const AllowsDoAction = () => {console.log('Parsing API and writting some things to FS -- PLACEHOLDER')}
const SomeTimeDoThisActionTo = () => {console.log('Parsing API and writting some other things to fs, by asking more data from the API and first, so it is long thing to do, so a new event can arrive first -- PLACEHOLDER')}
const deepEqual = (prev, cur) => prev === cur // normally a proper deepEqual...
const taps = [tap(AllowsDoAction)];
if (someCondition) taps.push(SomeTimeDoThisActionTo)
const observable = timer(0, 500).pipe(
   exhaustMap(SomeApiCall),
   distinctUntilChanged((prev, cur) => deepEqual(prev, cur))
   ...taps
);

我将返回文件系统写观察值(编辑2)

const SomeApiCall=()=>{
返回({some:'data'});
};
常量AllowsDoAction=()=>{
log('解析API并将某些内容写入FS--PLACEHOLDER');
返回计时器(100).管道(映射(()=>“写入1已完成”);
};
const SomeTimeDoThisActionTo=()=>{
console.log(
'解析API并向fs写入其他内容,方法是首先从API请求更多数据,因此这是一件很长的事情,因此新事件可以首先到达--占位符'
);
返回计时器(1000).pipe(映射(()=>“写入2已完成”);
};
然后使用等待所有文件系统操作完成

const deepEqual=(prev,cur)=>prev==cur;//通常情况下,适当的深度等于。。。
常数taps=[(AllowsDoAction)];
const someCondition=true;
如果(某些条件){
轻触。推动(有时将此动作推到);
}
const reduxStorageEvent$=of('用实际事件替换此事件');
const observable=merge(计时器(0500),reduxStorageEvent$).pipe(
排气图(SomeApiCall),
distinctUntilChanged((上一个,当前)=>deepEqual(上一个,当前)),
//使用switchMap取消以前的写入(编辑2)
//等待最新的写入操作,然后再开始新的写入操作
concatMap((某些数据)=>{
const writes=taps.map((tapFx)=>{
返回tapFx(someData);
});
//等待所有写入
返回forkJoin(…写入);
})
);

concatMap就像一个队列。此队列中的第一个必须在第二个可以启动之前完成。

我将返回文件系统写入观察值(编辑2)

const SomeApiCall=()=>{
返回({some:'data'});
};
常量AllowsDoAction=()=>{
log('解析API并将某些内容写入FS--PLACEHOLDER');
返回计时器(100).管道(映射(()=>“写入1已完成”);
};
const SomeTimeDoThisActionTo=()=>{
console.log(
'解析API并向fs写入其他内容,方法是首先从API请求更多数据,因此这是一件很长的事情,因此新事件可以首先到达--占位符'
);
返回计时器(1000).pipe(映射(()=>“写入2已完成”);
};
然后使用等待所有文件系统操作完成

const deepEqual=(prev,cur)=>prev==cur;//通常情况下,适当的深度等于。。。
常数taps=[(AllowsDoAction)];
const someCondition=true;
如果(某些条件){
轻触。推动(有时将此动作推到);
}
const reduxStorageEvent$=of('用实际事件替换此事件');
const observable=merge(计时器(0500),reduxStorageEvent$).pipe(
排气图(SomeApiCall),
distinctUntilChanged((上一个,当前)=>deepEqual(上一个,当前)),
//使用switchMap取消以前的写入(编辑2)
//等待最新的写入操作,然后再开始新的写入操作
concatMap((某些数据)=>{
const writes=taps.map((tapFx)=>{
返回tapFx(someData);
});
//等待所有写入
返回forkJoin(…写入);
})
);

concatMap就像一个队列。此队列中的第一个操作必须在第二个操作开始之前完成。

是异步操作还是同步操作?该操作是异步的,每个操作可以以任何顺序或同时运行,并且它们使用异步方式写入文件。(一旦我可以使用switchMap,我将把文件写入一个可观察的文件,可以使用stream-api-destroy方法取消订阅)您希望它们同时运行还是以队列方式运行都可以,所以我猜是同时运行?数据不会经常更改,将由一个在检查之间花费一段时间的进程进行检查…操作是异步的还是同步的?操作是异步的,每个操作可以以任何顺序或同时运行,并且它们使用异步方式写入文件。(一旦我可以使用switchMap,我将把文件写入一个可观察的文件,可以使用stream-api-destroy方法取消订阅)您希望它们同时运行还是以队列方式运行都可以,所以我猜是同时运行?数据不会经常更改,并且将由一个在检查之间花费一段时间的进程进行检查…据我所知,这将阻止事件从发送时间开始?因此它不会取消当前的写入?因此,一旦完成,它就会重写这些更改?我有两种情况需要进行多次写入:一种基于计时器,另一种来自redux存储更改。这在两种情况下都有效吗?它可以防止当前写入被取消。完成后,它将启动排队写入。如果您有多个源(计时器+重复使用),您可以使用合并,请参阅编辑的应答。我真的希望有一个模型可以取消以前的写入请求,然后启动新的写入请求,这样我们就不会对文件进行过多的编辑,而且知道最近的事件已得到处理,我会感觉更安全。但如果这个解决方案奏效,那就太好了。很难取消承诺。你也必须做出这些观察。然后使用switchMap而不是concatMap。请参阅(编辑2)据我所知,这将阻止事件从发送时间开始?因此它不会取消当前的写入?因此,一旦完成,它就会重写这些更改?我有两种情况需要进行多次写入:一种基于计时器,另一种来自redux存储更改。这在两种情况下都有效吗?它可以防止当前写入被取消。完成后,它将启动排队写入。如果您有多个源(计时器+重复使用),您可以使用合并,请参阅编辑的应答。我真的希望有一个模型可以取消以前的写入请求,然后启动新的一个,这样我们就不会编辑超出需要的文件,而且我会更安全地知道