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 }
这里是工作的笨蛋 …