2016-07-06 3 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] 
    } 
} 

요약 :

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() 
    }) 
    } 
: 솔루션 위 Günter Zöchbauer answer에 따르면 나는 이런 식으로 뭔가를 사용할 필요가 대신 그 중, 수 없습니다
+1

이 링크는 문제를 이해하는 데 도움이됩니다. http://stackoverflow.com/questions/23231909/collect-rxjs-observable-to-array – AngJobs

답변

5

HTTP 요청이 async이고 서버 호출이 수행되기 전에 get() 메서드가 반환되기 때문에이 작업을 수행 할 수 없습니다. 대신 서버의 응답이 도착하면 subscribe(...)으로 전달 된 콜백이 호출됩니다.

async에서 sync 실행으로 돌아갈 방법이 없습니다.

호출자가 호출 할 수있는 관찰 가능 항목 만 반환하고 응답이 도착하면 작업을 수행 할 수 있습니다.

관련 문제