【问题标题】:Accessing source observable from outside Rx.Observable.prototype从 Rx.Observable.prototype 外部访问源 observable
【发布时间】:2017-05-23 12:31:24
【问题描述】:

在这个方案中,我无法弄清楚如何访问源 observable(只是想弄清楚如何在不修改 Rx.Observable.prototype 的情况下做到这一点):

      q.drain()
        .flatMap(function(val){
            return q.backpressure(val, function(cb){
                   setTimeout(cb,1000);
            });
        })

我们将背压称为 Queue 原型上的一种方法:

Queue.prototype.backpressure = function(val, fn){

    const source = ? // I don't know how to access the source observable...

    return Rx.Observable.create(sub => {

        return source.subscribe(val => {

                fn.call(source, val, function(err, val){
                    if(err){
                        sub.error(err);
                    }
                    else{
                        sub.next(val);
                    }

                });
            },
            // be sure to handle errors and completions as appropriate and
            // send them along
            err => sub.error(err),
            () => sub.complete());

    });
};

但问题是我不知道我是否可以访问该方案中可观察到的源 - 源的正确值肯定是 不是 原型中的 this 值,因为它属于队列实例。我认为我唯一的希望是以某种方式将可观察的源直接传递到背压方法中。有谁知道我该怎么做?我不介意把这个函数放在别处,它不一定是队列中的方法,但我认为无论哪种方式都会存在同样的问题。

如果有帮助,flatMap 函数中this 的值(如果您使用常规函数而不是箭头函数)是 MergeMapSubcriber 对象,请参阅:

但是,经过实验,我不相信 MergeMapSubcriber 值是我想用作源的值;我的来源应该是 Observable TMK,而不是订阅者。

【问题讨论】:

    标签: javascript node.js rxjs5 angular2-observables


    【解决方案1】:

    你有没有想过把它放在Observable原型上?

    Observable.prototype.backpressure = function(queue, fn){
      const source = this;
    
      return this.flatMap(function(val){
        return Rx.Observable.create(sub => {
    
          return source.subscribe...
        });
      })
    };
    

    那么对于队列:

    q.drain()
      .backpressure(q, function(cb) {
        setTimeout(cb,1000);
      });
    

    【讨论】:

    • 是的,那很好,但如果不把它放在原型上,想知道怎么做就好了,至少作为一个练习,一定有办法!
    • 我更新了 OP,如果它提供了更多有用的信息,请告诉我
    • @Alexander Mills,不要以为你可以从 flatMap 联系到它。
    • 其实我觉得你不需要从 flatMap 中找到源头,我想我可能想多了
    • 换句话说,当使用 flatMap 时 - 我认为 RxJS 库会为您将源连接到目标,您不需要手动连接,您只是提供转换。
    猜你喜欢
    • 2016-05-13
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    相关资源
    最近更新 更多