我需要在我的代码中执行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
来获取对象的,但是当您尝试订阅它时,显然无法订阅父级?
答案 0 :(得分:1)
multicast()
运算符的第一个参数是主题工厂函数或主题实例。
这意味着如果你想拥有一个共享的Subject实例,你应该像这样使用它:
let multicast = observable.multicast(new Subject()).refCount();
......或者像这样为每个观察者制作一个新主题:
let multicast = observable.multicast(() => new Subject()).refCount();