Javascript “可观测的运算符”;“做”;经过一段时间后的事情

Javascript “可观测的运算符”;“做”;经过一段时间后的事情,javascript,angular,typescript,rxjs,rxjs-pipeable-operators,Javascript,Angular,Typescript,Rxjs,Rxjs Pipeable Operators,在一个rxjs可观测链中,在经过一段时间后,如何访问可观测的当前值?本质上,我在寻找类似的东西,但它只有在经过了一定的时间后才执行,而没有看到来自可观察对象的值。所以实际上,这就像是点击和超时的组合 我在想象下面的事情 observable$.pipe( first(x => x > 5), tapAfterTime(2000, x => console.log(x)), map(x => x + 1) ).subscribe(...); 这是一个虚构的示例

在一个rxjs可观测链中,在经过一段时间后,如何访问可观测的当前值?本质上,我在寻找类似的东西,但它只有在经过了一定的时间后才执行,而没有看到来自可观察对象的值。所以实际上,这就像是点击和超时的组合

我在想象下面的事情

observable$.pipe(
  first(x => x > 5),
  tapAfterTime(2000, x => console.log(x)),
  map(x => x + 1)
).subscribe(...);
这是一个虚构的示例,“tapAfterTime”函数不是真的。但其基本思想是,如果订阅后经过2000ms,而可观测值没有看到大于5的值,则对可观测值的当前值执行tapAfterTime回调函数。如果我们在2000ms之前看到一个大于5的值,那么tapAfterTime回调将永远不会运行,但map函数将始终按预期运行

是否有操作员来实现此功能或操作员的任意组合?

请查看

可能是这样的吗

--


它可以是这样的:

let cancel;
observable$.pipe(
  tap((x)=>clear=setTimeout(()=>console.log(x), 2000)),
   filter(x => x > 5),
   tap(x => clearTimeout(clear)),
   map(x => x + 1)
);

也许这真的太复杂了,也许值得一看

我们的想法是有两个不同的可观察对象,通过转换源
可观察对象$
创建,然后最终合并

第一个可观察的对象,我们称之为
obsfilterandapped
,是进行过滤和映射的对象

第二个可观察对象,我们称之为
obsTapDelay
,是一个可观察对象,它在第一个可观察对象的任何时间以一定的延迟触发一个新的计时器,即
obstilterdapped
,发射-一旦延迟时间过去,则执行
tapAfterTime
操作-如果第一个可观察对象在延迟时间过去之前发射一个新值,则创建一个新计时器

这是实现这个想法的代码

const stop = new Subject<any>();
const obsShared = observable$.pipe(
    finalize(() => {
        console.log('STOP');
        stop.next();
        stop.complete()
    }),
    share()
);
const delayTime = 300;
const tapAfterTime = (value) => {
    console.log('tap with delay', value)
}; 

let valueEmitted;

const obsFilterAndMapped = obsShared.pipe(
    tap(val => valueEmitted = val),
    filter(i => i > 7),
    map(val => val + ' mapped')
);

const startTimer = merge(of('START'), obsFilterAndMapped);

const obsTapDelay = startTimer.pipe(
    switchMap(val => timer(delayTime).pipe(
        tap(() => tapAfterTime(valueEmitted)),
        switchMap(() => empty()),
    )),
    takeUntil(stop),
)

merge(obsFilterAndMapped, obsTapDelay)
.subscribe(console.log, null, () => console.log('completed'))

通过更多的工作,我们甚至可以考虑在闭包中隐藏
valueemissued
全局变量,但这会增加代码的复杂性,可能不值得。它应该每2000ms静默一次,还是在前一个x>5发射值之后只运行一次?哦,由于它包含“first”(第一个),所以在我猜测DeBounceTime或debounce后应该运行它?在我的视频课程中,关于RxJS中的运算符的更多信息:
const stop = new Subject<any>();
const obsShared = observable$.pipe(
    finalize(() => {
        console.log('STOP');
        stop.next();
        stop.complete()
    }),
    share()
);
const delayTime = 300;
const tapAfterTime = (value) => {
    console.log('tap with delay', value)
}; 

let valueEmitted;

const obsFilterAndMapped = obsShared.pipe(
    tap(val => valueEmitted = val),
    filter(i => i > 7),
    map(val => val + ' mapped')
);

const startTimer = merge(of('START'), obsFilterAndMapped);

const obsTapDelay = startTimer.pipe(
    switchMap(val => timer(delayTime).pipe(
        tap(() => tapAfterTime(valueEmitted)),
        switchMap(() => empty()),
    )),
    takeUntil(stop),
)

merge(obsFilterAndMapped, obsTapDelay)
.subscribe(console.log, null, () => console.log('completed'))
const obs1 = interval(100).pipe(
    take(10),
);
const obs2 = timer(2000, 100).pipe(
    take(10),
    map(val => val + 200),
);
const observable$ = merge(obs1, obs2);