2017-08-13 71 views
1

之前等待的東西我有這樣的方法的http服務:角4,HTTP調用

get(url): Promise<Object> { 
    //await something here before next line 
     return this.httpClient.get(url) 
      .map((res) => { 
        return res as Object 
       }) 
       .toPromise(); 

我需要調用最終執行某些對象更新的方法。如何讓上述方法等到另一個完成?

+1

調用這個來自'。那麼()',你需要等待功能上? – Claies

+1

另一種方法是異步的嗎?這需要這個電話的迴應嗎? – Skeptor

+0

@Skeptor,它不需要獲得此調用的結果,但需要等到該調用完成。這是從後臺獲取來自Azure AD的新令牌的aquireToken方法,並更新了一堆存儲 我不認爲它應該是異步的,但如果它是,它可能會導致UI阻止 – LastTribunal

回答

2

這可以通過很多方式完成。其中之一是forkJoin(這類似於promise.all

// parallel method you want to execute , let this return an observable 
doSomething(){ 
    return this.http.get('token'....); 
} 

get(url): Promise<Object> { 
    return Observable.forkJoin([doSomething(),this.httpClient.get(url)]) 
     .map((res) => { //res is an array with both outputs 
      // we are only concerned with second response 
      return res[1] as Object; 
     }) 
     .toPromise(); 
+0

這將等待doSomething()完成? – LastTribunal

+1

是的,它並行運行並且只有在兩者都完成後才執行映射 – Skeptor

0

這是我如何解決它:

get(url): Promise<Object> { 
      return this.sendRequest(url, 'get', '') 
        .map((res) => { 
         return res as Object 
         }) 
        .toPromise(); 
     } 

    sendRequest(url, type, body): Observable<any> { 
      return this.adalService.acquireToken() 
       .flatMap((token: string) => { 
//I am not using the result of the flatmap, only exploiting it to ensure resolution, httpClient is being intercepted with the updated values 
        return this.httpClient[type](url, body) 
      }); 
    }