Multicast observable:尝试订阅“无法读取属性'订阅'未定义”错误的结果

时间:2017-07-20 08:35:54

标签: ecmascript-6 rxjs rxjs5

我需要在我的代码中执行AJAX请求并将结果数据发送到两个不同的地方,所以我认为使用多播observable是实现这一目标的最简单方法。我的代码如下所示:

在我的'app'对象的构造函数中:

this.getEpisodeDescription = (id) => jsonLoader("http://www.randomtext.me/api/lorem/p-2/8-24", "text_out");

function jsonLoader (url, field)
{
    let stream = Rx.Observable.ajax ({ url: url, crossDomain: true })
                                .retry (1)
                                .pluck ("response");
    if (field !== undefined)
        return stream.pluck(field);
    else
        return stream;
}

之前我已成功使用此方法检索单个接收器的数据,因此我确信这样做正常。然而,呼叫者是新的:

loadSummary (id)
{
    let cachedValue = this.summaries.get(id);
    if (cachedValue !== undefined) return Rx.Observable.of(cachedValue);

    let observable = this.app.getEpisodeDescription(id);
    let multicast = observable.multicast ().refCount ();
    multicast.subscribe(result => this.summaries.put(id, result));
    return multicast;
}

当我尝试执行此方法时,我得到以下堆栈跟踪:

Uncaught TypeError: Cannot read property 'subscribe' of undefined
    at Observable.ConnectableObservable._subscribe (app.js:44193)
    at Observable._trySubscribe (app.js:10253)
    at Observable.subscribe (app.js:10241)
    at RefCountOperator.call (app.js:44275)
    at Observable.subscribe (app.js:10238)
    at AsyncAction.SubscribeOnObservable.dispatch (app.js:71532)
    at AsyncAction._execute (app.js:21083)
    at AsyncAction.execute (app.js:21058)
    at AsyncScheduler.flush (app.js:21156)

(忽略文件名和行号 - 我正在使用webpack,目前似乎没有生成工作行号图)

任何想法发生了什么?具体来说,我是如何通过调用具有适当multicast等方法的subscribe来获取对象的,但是当您尝试订阅它时,显然无法订阅父级?

1 个答案:

答案 0 :(得分:1)

multicast()运算符的第一个参数是主题工厂函数或主题实例。

这意味着如果你想拥有一个共享的Subject实例,你应该像这样使用它:

let multicast = observable.multicast(new Subject()).refCount();

......或者像这样为每个观察者制作一个新主题:

let multicast = observable.multicast(() => new Subject()).refCount();