2016-08-30 5 views
0

커뮤니티에 대한 나의 첫 번째 질문은 여기! 내가 않는 응용 프로그램에서 일하고 있어요 다음과 같은 방법으로 API와 통신간격이있는 RxJS 관찰자들

1 단계 : 요청 페이로드를 추가 요청 옵션을 생성 -> API에 게시 요청이

API는 요청 ID로 응답

2 단계 : 업데이트 요청 옵션, 페이로드로 요청 ID를 전송 -> POST 요청 API에

최종 응답 : response.json

이제 최종 응답에 요청 된 데이터에 따라 약간의 시간이 걸릴 수 있습니다. 평균 시간은 4 ~ 20 초 사이입니다.

observables를 사용하여 이러한 요청을 연결하려면 어떻게해야합니까? switchmap을 사용해 보았지만 실패했습니다 (아래 참조).하지만 간격을 어떻게 추가합니까? 매 4 초마다 폴링하고 응답시 해지 가능한 솔루션입니까? 위의 상황에서이 작업은 어떻게 수행됩니까?

EDIT1 : 최종 목표는 : 나는 각도 및 학습 관찰 가능한 새로운 해요, 그리고 난 .. 이런 맥락에서 관찰 도움 체인 않습니다 앞으로 최선의 방법이 무엇인지 이해하기 위해 찾고 있어요? 즉 초기 응답 이후에 일종의 간격이 있고 flatMap 을 사용하거나 간격이있는 폴링을 사용하여 보고서가 준비되어 있는지 확인하십시오. 여기

내가 가진 무엇 지금까지

수출 클래스 reportDataService { 생성자 (개인 _HTTP : HTTP) {} 내 구성 요소의

headers: Headers; 
requestoptions: RequestOptions; 
payload: any; 
currentMethod: string; 


theCommonBits() { 
    //create the post request options 
    // headers, username, endpoint 
    this.requestoptions = new RequestOptions({ 
     method: RequestMethod.Post, 
     url: url, 
     headers: newheaders, 
     body: JSON.stringify(this.payload) 
    }) 
    return this.requestoptions; 
} 
// report data service 
reportService(payload: any, method: string): Observable<any> { 
    this.payload = payload; 
    this.currentMethod = method; 
    this.theCommonBits(); 
    // fetch data 
    return this._http.request(new Request(this.requestoptions)) 
     .map(this.extractData) 
     .catch(this.handleError); 
} 

private extractData(res: Response) { 
    let body = res.json(); 
    return body || {}; 
} 

private handleError(error: any) { 
     let errMsg = (error.message) ? error.message : 
     error.status ? `${error.status} - ${error.statusText}` : 'Server error'; 
    console.error(errMsg); // log to console instead 
    return Observable.throw(errMsg); 
} 

무엇 사용에 대한

fetchData() { 
    this._reportService.reportService(this.payload, this.Method) 
      .switchMap(reportid => { 
      return this._reportService.reportService(reportid, this.newMethod) 
     }).subscribe(
     data => { 
      this.finalData = data; 
      console.info('observable', this.finalData) 
     }, 
     error => { 
      //console.error("Error fetcing data!"); 
      return Observable.throw(error); 
     } 
     ); 
} 
+0

당신의 질문은 저에게 아주 불분명 한 것처럼 보입니다. 무엇을 성취하려고합니까? 2 회의 API 호출을 연결하기 만하면됩니까? 아니면 주기적으로 호출해야합니까? –

+0

시간 내 주셔서 감사합니다! 내 최종 목표를 추가했습니다. 앞으로 나아갈 수있는 최선의 방법을 찾으려고합니다.이 방법을 사용하거나 다른 방법으로 연결을 사용하십시오. 모든 새로운 요청에 대해서만이 서비스를 호출해야합니다. – anilZ

답변

0

Observable 대신 서비스에서 약속하고 구성 요소의 .then() 메서드. 그들 사이의 작업을 연결하려는만큼 .then()을 연결할 수 있습니다.

+0

안녕하세요! 나는 각도 2에서 약속을 사용하려고 시도하지 않았다. 두 번째 API 호출 전에 8 초 동안 대기하는 각도 1에서 setTimeout 함수를 사용했다. (그러나 가끔 페이로드가 복잡하면 실패 할 수도있다.) 관찰자가 더 좋은 방법 일지 궁금합니다. – anilZ

+0

첫 번째 응답 후 두 번째 API가 호출되기를 원하십니까? 그렇다면 서비스 호출에 .then() 함수를 사용할 수 있습니다. –

+0

그러나 특정 시간 이후에 조치를 취하고 싶다면 'Observable} from'rxjs/Rx '; Observable.timer (8000) (이 타이머를 구독해야합니다) –