【发布时间】:2019-02-24 04:45:34
【问题描述】:
我想从 Angular 服务中提供一个 rxjs Subject,以便能够通过调用服务上的方法来发出值(通过 next)。我希望它发出的值之一是 Angular HttpClient get 调用的结果。我似乎无法做到正确。我想知道为什么以下结果导致未调用订阅处理程序:
-查看
export default abstract class TileView implements OnInit {
constructor (private configService : ConfigService) {}
ngOnInit () {
this.configService.fetch(this.type()).subscribe( res => {
console.log(res)
});
}
}
-服务
export class ConfigService {
public subject = new AsyncSubject();
constructor (private http : HttpClient) {}
fetch (type) {
this.http.get(
api.host + api.base + interpolate(api.config, { type }) + "/"
).subscribe( res => {
this.subject.next(res);
});
return this.subject;
}
}
有什么方法可以返回主题并通过单个方法调用触发 http 调用?这很奇怪,因为返回了主题,注册了订阅者,http 调用完成并调用了this.subject.next(res),但订阅处理程序甚至没有运行。
【问题讨论】:
-
你在哪里订阅这个主题?您已经创建了“下一个”,但在听什么?
-
主题是从我在那里显示的视图中调用
fetch返回的。subscribe正在那里发生。 -
我不确定我是否完全理解您想要达到的目标。如果您订阅 fetch,它将返回您获取的结果。只需在需要结果的任何地方调用 service.fetch 即可。 Http.get 构造一个 observable。 angular.io/api/common/http/HttpClient
-
这就是我的意思是它不起作用。我正在订阅 fetch 并且订阅者永远不会触发,即使 http 调用已成功完成数据。
-
http.get 已经是可观察的,可以在没有主题的情况下订阅。只需从您的 get 订阅中返回 res 即可,我认为您不需要这样的订阅:
fetch (type) { this.http.get( api.host + api.base + interpolate(api.config, { type }) + "/" ).subscribe( res => { return res });
标签: angular rxjs observable behaviorsubject