我想知道是否可以做以下事情:
我需要直接从http GET
请求返回响应,而不是返回Observable<Response>
实例。
这个例子可能会澄清一切:
@Injectable()
export class ExampleService {
constructor( @Inject(Http) protected http: Http) { }
static model: { [uri: string]: any } = {}
public get(uri: string): any {
if (typeof ExampleService.model[uri] === 'undefined') {
ExampleService.model[uri] = this.http.get(uri).map(response => response.json()) // additionally do some magic here, it is Observable<any> instance now
}
return ExampleService.model[uri]
}
}
总结:根据Günter Zöchbauer answer上面的解决方案是不可能的,而不是我需要使用这样的东西:
public get(uri: string): Observable<any> {
return new Observable(observer => {
if (!ExampleService.model[uri]) {
let sub = this.http.get(uri).map(response => response.json()).subscribe(
src => observer.next(ExampleService.model[uri] = src),
err => console.error(err),
() => observer.complete()
)
return () => sub.unsubscribe()
}
observer.next(ExampleService.model[uri])
observer.complete()
})
}
答案 0 :(得分:5)
这是不可能的,因为HTTP请求是异步的,get()
方法在调用服务器之前返回。相反,当来自服务器的响应到达时,调用传递给subscribe(...)
的回调。
无法从异步返回到同步执行。
您只能返回调用者的observable来订阅它,并在响应到达时执行某些操作。