private createLoader(showTime: number, hideTime: number, request$: Observable<any>): Observable<boolean> {
const timerToShow$ = timer(showTime).pipe(
takeUntil(request$),
mapTo(true)),
]);
const timerToHide$ = race([
request$,
timer(hideTime),
])
.pipe(
mapTo(false)
);
return merge(timerToShow$, timerToHide$);
}
private loaderState = {
timeout: null,
completed: null,
}
private startLoader() {
setTimeout(() => this.onLoaderStarting(), 500);
this.loaderState.timeout = setTimeout(() => this.onLoaderTimeout(), 3000);
}
private onLoaderStarting() {
if (!this.loaderState.completed) {
this.loaderSource$.next(true)
}
}
private onLoaderTimeout() {
this.loaderState.timeout = null;
this.emitLoaderFalse();
}
private onRequestComplete() {
this.loaderState.completed = true;
this.emitLoaderFalse();
}
private emitLoaderFalse() {
if (this.loaderState.completed && !this.loaderState.timeout) {
this.loaderSource$.next(false);
}
}
1. То есть, основной callback промиса тоже является микротаской, как then, catch и finally?
2. И как объяснить, почему тогда за 3 отправляется 6, а не 3 => 4 => 5?
3. Почему очередность именно такая, то есть, почему он микротаски каждого промиса начинает добавлять по очереди, а не в глубину (как покаказал в вопросе 2)?
даст вам срабататывания false когда завершились оба условия.
takeLast(2) - пропустит два значения перед завершением, но их там всегда два, это ничего не даст.
takeLast(1) тогда уж, это отфильтрует первый. или тоже самое skip(1)
true отменяется, а false не мешает.