【问题标题】:RX-JS 5 - Using "lift" to log Observable data for debuggingRX-JS 5 - 使用“lift”记录 Observable 数据以进行调试
【发布时间】:2016-11-18 11:11:19
【问题描述】:

我是 RX-JS 的新手,并且想记录数据以进行调试。 最后,我需要记录在一段代码中定义的每个可观察对象以及从这些可观察对象中发生的所有事件/数据发射。

对于 RX-JS 如果我覆盖 lift ,就可以将行为注入到操作者链中的所有观察者中, 但是我如何记录那些尚未应用于任何操作员的 RX-Observables 呢?

记录所有可观察对象以覆盖 lift 并订阅每个可观察对象以记录数据是否是正确的方法, 因为 do 运算符不起作用。

这就是我的尝试

const _lift = Rx.Observable.prototype.lift;
var idCounter = 0;
Rx.Observable.prototype.lift = function (operator) {
    var sourceObs = this ;
    sourceObs.id = ++idCounter;
    var resultantObservable = _lift.call(sourceObs, operator);
    resultantObservable.id = ++idCounter;
    // In this Method i log data 
    LogObserver(operator , sourceObs , resultantObservable);
    return resultantObservable;
};

以上代码适用于

var timer = Rx.Observable.interval(1000).take(4);

但不适用于

var sequence = Rx.Observable.range(1, 10);

提前致谢。

最好的问候

【问题讨论】:

    标签: rxjs rxjs5


    【解决方案1】:

    我明白你想要做什么,但你做这件事的方式有点奇怪。我不知道您是否听说过 .let 运算符。 如果你这样做:

    const subscribe = source
      .map(val => val + 1)
      .let(obs => {
         // do stuff with the observable here and return it afterwards
         // to not break the chain
         return obs;
      });
    
      .subscribe(val => console.log(val));
    

    让您可以完全访问 observable,而不仅仅是其中的值。你可以用它做你想做的事。您需要在 let 函数中返回一个 observable,但如果您只是做您想做的事,然后返回原始数据。你不会打破链条,你可以做你想做的事。

    更多信息在这里:https://github.com/btroncone/learn-rxjs/blob/master/operators/utility/let.md

    【讨论】:

    • 感谢您的回复。我想在不修改代码本身的情况下调试任何一段 RX-JS 代码。这就是为什么寻找一些 RX-JS 接口/覆盖 RX-JS 的一部分来嗅探/记录每个事件的原因。我希望现在更清楚了?我正在尝试开发类似jaredforsyth.com/rxvision/examples/playground
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多