Javascript Subject调用next导致一个奇怪的错误
这会导致以下错误:Javascript Subject调用next导致一个奇怪的错误,javascript,rxjs,Javascript,Rxjs,这会导致以下错误:无法读取未定义的属性“length” const msg$ = new Subject<string>(); msg$.subscribe(console.log) of("Hello").subscribe(msg$.next); const msg$=new Subject(); msg$.subscribe(console.log) 订阅(msg$.next); 但是,如果我在函数中包装msg$.next,那么它可以正常工作,没有任何
无法读取未定义的属性“length”
const msg$ = new Subject<string>();
msg$.subscribe(console.log)
of("Hello").subscribe(msg$.next);
const msg$=new Subject();
msg$.subscribe(console.log)
订阅(msg$.next);
但是,如果我在函数中包装msg$.next,那么它可以正常工作,没有任何错误
- Lambda函数
const msg$=new Subject();
msg$.subscribe(console.log)
订阅(问候语=>msg$.next(问候语));
- 匿名函数
const msg$=new Subject();
msg$.subscribe(console.log)
订阅(功能(问候语){
msg$.next(问候语);
});
- 命名函数
功能NEXTMG(问候语){
msg$.next(问候语);
}
const msg$=新主题();
msg$.subscribe(console.log)
认购(NEXTMG);
它们都只是包装函数,除了调用下一个函数外,似乎什么也不做。这是怎么回事?看来这里有一个我不知道的JavaScript抓到你了。为了子孙后代,我接受了这个答案
我认为这个问题可以归结为“当将函数作为参数传递时,“this”的值是多少?”。你可以在这里找到一些答案
此
在第一个示例中的值错误。如果将console.log(this)
放在nextsg
中,您将看到它是一个SafeSubscriber
,它缺少可访问的属性observators.length
。rxjs6中的Subject#next
函数依赖于它成为具有observer.length属性的Subject
是的,当然。我没有注意到这似乎很愚蠢msg$.next.bind(msg$)
有效
obj.func
没有将obj
作为上下文,而obj.func()
作为上下文。为了子孙后代的缘故接受了答案
我认为这个问题可以归结为“当将函数作为参数传递时,“this”的值是多少?”。你可以在这里找到一些答案
此
在第一个示例中的值错误。如果将console.log(this)
放在nextsg
中,您将看到它是一个SafeSubscriber
,它缺少可访问的属性observators.length
。rxjs6中的Subject#next
函数依赖于它成为具有observer.length属性的Subject
是的,当然。我没有注意到这似乎很愚蠢msg$.next.bind(msg$)
有效
obj.func
没有将obj
作为上下文,而obj.func()
有上下文。我认为这个问题归结为“当将函数作为参数传递时,“this”的值是什么?”。你可以在这里找到一些答案<代码>此
在第一个示例中的值错误。如果将console.log(this)
放在nextsg
中,您将看到它是一个SafeSubscriber
,它缺少可访问的属性observators.length
。rxjs6中的Subject.next
函数依赖于this
成为Subject
和observators.length
属性。当然是的。我没有注意到这似乎很愚蠢msg$.next.bind(msg$)
有效a.func
没有a
作为上下文,而a.func()有。如果你把你的评论作为答案,我会接受。如果你使用source$.subscribe(主观性)
,它也会起作用。它将自动调用subject.{next,error,complete}()
,具体取决于source$
发出的内容。我认为这个问题归结为“当将函数作为参数传递时,“this”的值是多少?”。你可以在这里找到一些答案<代码>此
在第一个示例中的值错误。如果将console.log(this)
放在nextsg
中,您将看到它是一个SafeSubscriber
,它缺少可访问的属性observators.length
。rxjs6中的Subject.next
函数依赖于this
成为Subject
和observators.length
属性。当然是的。我没有注意到这似乎很愚蠢msg$.next.bind(msg$)
有效a.func
没有a
作为上下文,而a.func()有。如果你把你的评论作为答案,我会接受。如果你使用source$.subscribe(主观性)
,它也会起作用。它将自动调用subject.{next,error,complete}()
,具体取决于source$
发出的内容。
const msg$ = new Subject<string>();
msg$.subscribe(console.log)
of("Hello").subscribe(greeting => msg$.next(greeting));
const msg$ = new Subject<string>();
msg$.subscribe(console.log)
of("Hello").subscribe(function(greeting){
msg$.next(greeting);
});
function nextMsg(greeting){
msg$.next(greeting);
}
const msg$ = new Subject<string>();
msg$.subscribe(console.log)
of("Hello").subscribe(nextMsg);