Я пытаюсь повернуть это:
/* ...inside a pipe */
tap(() => logData('my process')),
tap(() => someCallback()),
tap(() => logDataEnd('my process'),
/* pipe continues */
В новый оператор, который принимает обратный вызов () => someCallback()
и добавляет побочные эффекты журналирования до и после него. Мои функции ведения журнала используют performance.now()
, и они работают должным образом *, когда я просто использую явную tap
версию, но ни один из моих операторов не делает то же самое.
Ожидаемые результаты
Труба с использованием моего оператора:
of(null).pipe(
withLogging(() => callbackA()),
withLogging(() => callbackB()),
/* etc. */
)
должен создать журнал, который выглядит следующим образом:
Action A start
Action A end
Action B start
Action B end
...
Однако я получаю это:
Action A start
Action B start
/* ... rest of the pipe */
Action A end
Action B end
Посмотрев на временные метки, я вижу, что журналы end
имеют правильные метки времени, но begin
- слишком рано.
Я пробовал использовать defer
по-разному, но результат не изменился.
Что я пробовал
withLogging<T, R>(project: (value :T) => R): OperatorFunction<T, R> {
return (source: Observable<T>) =>
defer(() => of(startLogging())).pipe(
flatMap(() => source),
tap(() => stopLogging())
);
}
Я пробовал обернуть весь канал defer
или просто начать процесс регистрации, или сделать of(null).pipe
, а затем объединить все эффекты. Я даже пробовал вообще не использовать defer
и просто возвращал канал, начинающийся с null
. Ничто не привело к желаемому поведению.