Angular 2 – 直接从Observable返回数据

我一直在试图弄明白这个问题,而我一直在嘲弄我的头脑,没有任何我能读的文件给了我一个答案。

我有一个直接和API通话的服务,并返回一个可观察的事件,在正常情况下,我会订阅并按照我所希望的方式来处理这些数据,但是在一个利用来自平静服务请求的辅助服务中,我需要能够从请求中返回值。

getSomething() { return this._restService.addRequest('object', 'method').run() .subscribe( res => { res; }, err => { console.error(err); } ); } returnSomething() { return this.getSomething(); } 

在上面的快速示例中,我想知道是否有任何方法可以从getSomething()中的getSomething()返回res 。 如果这样做是不可行的,还有什么办法呢? 我会补充说,_restService是非常依赖,我真的不想开始搞乱。

由于http调用等是asynchronous的,你会得到一个Observable而不是返回的同步值。 你必须订阅它,并在那里的callback你得到的数据。 这是没有办法的。

一种select是将您的逻辑放在subscribe呼叫中

 getSomething() { return this._restService.addRequest('object', 'method').run() .subscribe( res => { // do something here res; }, err => { console.error(err); } ); } 

但我喜欢这样做的方式是添加一个callback,从外部注入逻辑(也许是一个组件,也许是另一个服务):

 getSomething(callback: (data) => void) { return this._restService.addRequest('object', 'method').run() .subscribe( res => { callback(res); }, err => { console.error(err); } ); } 

并在您的组件或任何地方:

 this._yourService.getSomething((data) => { // do something here console.log(data); }); 

我自己并没有使用这个,但是我相信它理论上是可行的(:

 // service.ts getSomething() { let subject: Subject = new Subject(); this._restService.addRequest('object', 'method').run() .subscribe(subject); return subject; } // this can be removed (; returnSomething() { return this.getSomething(); } // component.ts ngOnInit() { this.service.returnSomething() .subscribe(res => console.log(res), err => console.log(err)); } 

检查主题文档的更多信息。 您可以使用不同types的主题,例如BehaviorSubject具有您可以访问的value属性…

 ngOnInit() { // if you use BehaviorSubject this.service.returnSomething().value } 

这里是工作的笨蛋 …