【发布时间】:2020-10-14 19:15:49
【问题描述】:
假设我有一个动作流。它们是提示、响应(对提示)或效果。它们以不规则的间隔出现,但假设每个间隔有 1 秒的延迟。
在每个PROMPT 操作上,我想发出该操作和一个 BEGIN 操作(假设我们想向用户显示消息 N 秒)。所有其他项目应延迟 N 秒,然后触发 END 操作(隐藏消息),一切继续。
这是我的代码(https://rxviz.com/):
const { interval, from, zip, timer } = Rx;
const { concatMap, delayWhen } = RxOperators;
const PROMPT = 'P';
const RESPONSE = 'R';
const EFFECT = 'E';
const BEGIN = '^';
const END = '&';
const convertAction = action => (action === PROMPT) ? [PROMPT, BEGIN, END] : [action];
// Just actions coming at regular intervals
const action$ = zip(
from([PROMPT, RESPONSE, EFFECT, PROMPT, RESPONSE, EFFECT, EFFECT, EFFECT]),
interval(1000),
(a, b) => a,
);
action$.pipe(
concatMap(action =>
from(convertAction(action)).pipe(
delayWhen(action => (action == END) ? timer(5000) : timer(0)),
),
),
);
我真正想做的是在PROMPT 之后的第一个RESPONSE 操作不受延迟的影响。如果它出现在 END 动作之前,它应该立即显示。所以,而不是
P^ &REP^ &REEE
我想收到
P^ R &EP^R &EEE
如何在将每个RESPONSE 保留在其对应的PROMPT 之后实现它?假设在PROMPT 和RESPONSE 之间没有任何事件。
【问题讨论】:
-
你在
zip一个函数?(a, b) => a- 我很惊讶帽子的作用。那有什么作用? -
它采用数组的值并将它们按间隔时间间隔。
a是第一个流项目(元素),b是第二个流项目(延迟无值)。 -
TIL 如果有一个函数作为最后一个参数,
zip使用它来格式化它的输出......整洁! -- 我一直用zip().pipe(map())来达到同样的效果。 -
是否可以假设第二个提示总是在第一个响应之后,或者更一般地说,Promp N+1 总是在 ResponseN?
-
@Picci 是的。它们基本上无法区分,但每个 Prompt 后面都会有 Response(在未知时间之后)。
标签: javascript rxjs reactive-programming