首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxJ,subscribe(AnotherBehaviorSubject) vs subscribe((elem) => AnotherSubject.next(elem))

RxJ,subscribe(AnotherBehaviorSubject) vs subscribe((elem) => AnotherSubject.next(elem))
EN

Stack Overflow用户
提问于 2020-08-28 03:33:52
回答 1查看 47关注 0票数 0

在angular 9中,我注入了一个http对象,我用它调用get并订阅响应。如下所示

代码语言:javascript
复制
somethingElse = new BehaviorSubject<Tweet[]>([]);

http.get<Tweet[]>('/api/bla').subscribe(tweets => somethingElse.next(tweets);

查看Observable的应用程序接口规范,可以看到subscribe(observer?: PartialObserver<T>): Subscription;

太棒了,BehaviorSubject是PartialObserver (有next: (value: T) => void;方法)

那么为什么下面的方法不起作用呢?

代码语言:javascript
复制
somethingElse = new BehaviorSubject<Tweet[]>([]);

http.get<Tweet[]>('/api/bla').subscribe(somethingElse);

// NEITHER DOES THIS
// Should be semantically equal to the lambda above?
http.get<Tweet[]>('/api/bla').subscribe(somethingElse.next);

在后两种情况下,都不会调用回调。问题是关于什么的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-28 08:01:19

行为主体既是观察者又是观察者。如果您在订阅中使用它,请记住,当它们发出时,您还会传递一个complete,http调用complete,因此这也将完成behavior主题。

代码语言:javascript
复制
const { of, BehaviorSubject } = rxjs;

const bs$ = new BehaviorSubject('inital');

bs$.subscribe(val => console.log('First sub', val));

of('hello').subscribe(bs$); // of completes and also completes the behavior subject

bs$.subscribe(val => console.log('Sub after complete', val));

bs$.next('we are already complete');
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.6.2/rxjs.umd.min.js"></script>

至于http.get<Tweet[]>('/api/bla').subscribe(somethingElse.next);,它在未定义的异常中抛出一个无法找到长度的异常。我猜这是一个this绑定问题,方法现在被绑定到新的可观察对象,而它没有正确的这个绑定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63623037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档