2016-07-06 219 views
1

我想知道如果下面的事情是可以做到:如何返回Http響應?

我需要返回從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() 
    }) 
    } 
+1

此鏈接應該有助於理解問題http://stackoverflow.com/questions/23231909/collect-rxjs-observable-to-array – AngJobs

回答

5

這是不可能的,因爲HTTP請求是異步的並且get()方法在調用服務器之前返回。相反,當服務器的響應到達時,調用傳遞給subscribe(...)的回調。

無法從異步恢復到同步執行。

您只能返回調用者的observable訂閱它並在響應到達時執行某些操作。