多播可观察:尝试订阅导致 "cannot read property 'subscribe' of undefined" 错误
Multicast observable: attempting to subscribe results in "cannot read property 'subscribe' of undefined" error
我的代码需要执行 AJAX 请求并将结果数据发送到两个不同的地方,因此我认为使用多播可观察对象是实现此目的的最简单方法。我的代码如下所示:
在我的 '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,它目前似乎没有生成工作行号映射)
知道发生了什么事吗?具体来说,我如何从具有适当 subscribe
等方法的 multicast
调用中得到一个对象,但是当您尝试订阅它时,它显然无法订阅父对象?
multicast()
运算符的第一个参数是 Subject 工厂函数或 Subject 实例。
这意味着如果你想拥有一个共享的 Subject 实例,你应该像这样使用它:
let multicast = observable.multicast(new Subject()).refCount();
...或者像这样为每个观察者创建一个新的主题:
let multicast = observable.multicast(() => new Subject()).refCount();
我的代码需要执行 AJAX 请求并将结果数据发送到两个不同的地方,因此我认为使用多播可观察对象是实现此目的的最简单方法。我的代码如下所示:
在我的 '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,它目前似乎没有生成工作行号映射)
知道发生了什么事吗?具体来说,我如何从具有适当 subscribe
等方法的 multicast
调用中得到一个对象,但是当您尝试订阅它时,它显然无法订阅父对象?
multicast()
运算符的第一个参数是 Subject 工厂函数或 Subject 实例。
这意味着如果你想拥有一个共享的 Subject 实例,你应该像这样使用它:
let multicast = observable.multicast(new Subject()).refCount();
...或者像这样为每个观察者创建一个新的主题:
let multicast = observable.multicast(() => new Subject()).refCount();