2016-05-11 52 views
1

我試圖做到以下沒有成功。我試圖根據先前的http請求結果激發http請求/ Observable。如何將2個Observable與Angular2鏈接起來

ngOnInit() { 
    this._lights.LastChannel(this.hostname).subscribe(data => { 
     this.LastChannel = data.Message; 
     this.shields = this.LastChannel/8; 
     if (this.LastChannel % 8 != 0){ 
      this.shields++; 
     } 
     for(var i=0; i < this.shields; i++){ 
      console.log(i+1); 
      this.shield(i+1) 
     } 
    }); 
} 
shield(index){ 
    this._lights.shieldStatus(this.hostname, index) 
     .subscribe(data=> { 
      console.log(data.Message.split(' ')); 
      console.log(data.Message) 
     }) 
} 

第一次請求正常運行,第二次請求被解僱。 Go服務器響應200,但瀏覽器顯示保持未決狀態。

+0

我需要data.messages的值才能設置屏蔽函數的索引以激發第二個請求。有人指出我使用rxjs concatmap。我現在還無法弄清楚 – CESCO

回答

1

您需要flatMap運營商這個

this._lights.LastChannel(this.hostname).flatMap(
    (data) => { 
    let params: URLSearchParams = new URLSearchParams(); 
    params.set('access_token', localStorage.getItem('access_token')); 
    return this._lights.shieldStatus(this.hostname, data.messages).map((res: Response) => res.json()); 
    } 
); 

@ThierryTempiler這裏回答了這個問題:Angular 2: Two backend service calls on success of first service

1

你需要創建一個將使用Observable.forkJoin加入這兩種請求第三服務功能。

initial (device){ 
     var obs = this.LastChannel(device).flatMap(
      (data) => { 
       return Observable.forkJoin([ 
        Observable.of(data), 
        this.shieldStatus(device, data) 
       ]); 
      } 
     ); 
     return obs; 
    } 

然後我可以調用它像

ngOnInit() { 
    this._lights.initial(this.hostname).subscribe(data=> console.log(data)) 
} 

並且該數據是兩個請求的響應的陣列。

Array[2] 
0 
: 
Object 
Message 
: 
"64" 
Time 
: 
"2016-05-14T09:13:12.416400176-03:00" 

1 
: 
Object 
Message 
: 
"false false false false false true true true" 
Time 
: 
"2016-05-14T09:13:12.797315391-03:00" 

: 
2 
__proto__ 
: 
Array[0] 
相關問題