首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在回调之前和之后添加日志记录的rxjs运算符。

在回调之前和之后添加日志记录的rxjs运算符。
EN

Stack Overflow用户
提问于 2019-08-12 12:15:34
回答 1查看 282关注 0票数 1

我试着改变这个:

代码语言:javascript
复制
/* ...inside a pipe */
tap(() => logData('my process')),
tap(() => someCallback()),
tap(() => logDataEnd('my process'),
/* pipe continues */

进入一个新的操作符,该操作符接受回调() => someCallback(),并在它之前和之后添加日志记录副作用。我的日志函数使用performance.now(),当我只使用显式的tap版本时,它们就像预期的那样工作,但是我的操作符都没有做同样的事情。

预期结果

使用我的接线员的管道:

代码语言:javascript
复制
of(null).pipe(
  withLogging(() => callbackA()),
  withLogging(() => callbackB()),
  /* etc. */
)

应该生成如下所示的日志:

代码语言:javascript
复制
Action A start
Action A end
Action B start
Action B end
...

不过,我明白了:

代码语言:javascript
复制
Action A start
Action B start
/* ... rest of the pipe */
Action A end
Action B end

通过查看时间戳,我可以看到end日志的时间戳是正确的,但是begin日志还为时过早。

我尝试过以不同的方式使用defer,但是结果并没有改变。

我试过什么

代码语言:javascript
复制
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开头的管道。什么也没有产生想要的行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-12 12:31:54

除非您的someCallback()本身是异步的和/或您将来想要flatMap它,否则我不会在这里实现一个新的操作符。一个简单的香草高阶函数可以很好地满足你的需要。

代码语言:javascript
复制
function withLogging<A extends unknown[], C>(
  cb: (this: C, ...args: A) => void
) {
  return function(this: C, ...args: A) {
    console.log("before");
    cb.call(this, ...args);
    console.log("after");
  };
}

// snip

function someCallback() {
    console.log('Hello!');
}

someObs$.tap(withLogging(someCallback)); // before, Hello!, after for each pushed element
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57461030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档