2016-12-07 140 views
2

我想在Angular 2中使用Observable時處理異步流。 詳細地說,在每個用戶請求之前,我需要獲取服務票證,如果該票證是有效的,用戶可以得到適當的迴應。因此,在實際請求之前,我必須先執行http請求,如下所示,我調用getServiceTicket()方法,但是,由於異步流,在獲取有效的服務票據之前,會執行以下http請求(getDetail)有效的服務票據。所以我嘗試使用像isServiceTicket這樣的標誌,但我意識到它並不能保證這兩種方法的順序運行。我試圖做一些研究,但我找不到滿意的答案。如果有人有這個好的解決方案,你可以給一些建議嗎?根據前一個請求的角度執行http請求2

getServiceTicket() { 
    this.userAuthServie.getServiceTicket().subscribe(
     (data: string) => {this.serviceTicket = data; this.isServiceTicket = true;} 
    ); 
} 

getDetail(id: string) { 
    this.getServiceTicket(); 
    return this.http.get('https://localhost/detail/' + id + '?ticket=' + this.serviceTicket) 
    .map((responseData) => { 
     return <User>responseData.json(); 
    } 
    ); 
} 
+0

也許您正在尋找這樣的:https://coryrylan.com/blog/angular-multiple-http-requests-with-rxjs – Ploppy

回答

0

您可以更改侑代碼象下面這樣:

user:User; 

     getDetail(id: string) { 

     this.userAuthServie.getServiceTicket() 
      .subscribe((data: string) => { 
      this.serviceTicket = data; 
      this.isServiceTicket = true; 
      this.http.get('https://localhost/detail/' + id + '?ticket=' + this.serviceTicket) 
       .map((responseData) => { 
       this.user= <User>responseData.json(); 
       }); 
      }); 

     } 
+0

如果我這樣做的方式,我得到「無法讀取屬性「訂閱「未定義」。 –

+0

在UserAuthService中提供代碼getServiceTicket –

+0

非常感謝。以下是來自UserAuthService的getServiceTicket。 getServiceTicket(){ let cuser = JSON.parse(localStorage.getItem('cUser')); let creds =「servicename = http://xxx.xxx.xxx」; let headers = new Headers(); headers.append('Content-Type','application/x-www-form-urlencoded'); (cuser.token){this.ttl.post('https:// localhost/serviceTicket /'+ cuser.token +'?serviceName = http://xxx.xxx.xxx',creds,{ ) .map(res => res.json()) } } –

0

您可以將要在第一個函數的訂閱方法的成功一部分運行的第二功能。

getServiceTicket() { 
    this.userAuthServie.getServiceTicket().subscribe(
     (data: string) => { 
      this.serviceTicket = data; this.isServiceTicket = true; 
      this.getDetail(id); 
     } 
    ); 
} 
+0

非常感謝您的回答。我還有一個問題,我之所以實現這種方式,是因爲我想實現分別獲取服務票據的方法,這意味着每當我需要服務票據時,我想在實際的http請求之前調用該方法並獲得服務並將該服務票據傳遞給真實的http請求方法。如果我以這種方式實施,我必須重複以下代碼。 「this.userAuthServie.getServiceTicket()。subscribe(」so ... –

+0

你可以有兩個單獨的方法來執行此操作,或者只需在同一個方法中執行if語句即可執行或不執行所引用的部分 – Arash

0

如果你想等待服務票證被加載執行任何「具體要求」之前,您應該等待服務票據的響應來解決。有多種方式,一種方式可能是將細節添加到隊列中,或者getDetails等待直到加載服務票證。

getServiceTicket() { 
    // you need to return the observable from service ticket 
    return this.userAuthServie 
     .getServiceTicket() 
     // use map here to only intercept the value. 
     // remember that you need to subscribe somewhere else 
     // if called from elsewhere than getDetail 
     .map((data: string) => { 
      this.serviceTicket = data; 
      this.isServiceTicket = true; 
      return data; 
     }); 
} 

getDetail(id: string) { 
    return this.getServiceTicket() 
     // we switch the observable from ticket to the one from detail using switchMap 
     .switchMap((data: string) => { 
      let url = 'https://localhost/detail/' + id + '?ticket=' + this.serviceTicket; 
      return this.http 
       .get(url) 
       .map((responseData) => { 
        return <User>responseData.json(); 
       }); 
     }); 
    } 
} 
+0

非常感謝,但是我得到這個「Property'switchMap'不存在於類型'Observable '。如果你有一些線索,請給我一些解釋嗎? –

+0

工作非常好吧,非常感謝你! –

+0

switchMap有什麼問題? – Patrick