2017-08-14 47 views
2

我對RxJs比較新,在處理使用switchMap運算符發出的多個項目後無法鏈接單個操作。在處理多個項目後在RxJS中運行單個操作

場景:使用後端數據爲下拉列表生成對象數組,然後鏈接單個操作以設置下拉列表的選定值。

下面是有助於說明問題的非工作代碼。

this.sub = this.dataService.getUserData() 
    .switchMap((data) => Observable.from(data)) // create new data stream from inner data set 
    .map((data: any) => { 
     return { value: data._id, viewValue: data.firstName + ' ' + data.lastName }; 
    }) // create data structure for drop down 
    .subscribe((data) => { 
     this.userDropDown.push(data); // this operation needs to run once per item emitted, and is working 
     this.patchFormData(); // <-- However, this only needs to run once 
    }, 
    (error) => console.log("error", error) 
    ); 

我已經試過了變形的問題,但我無法來解決這個問題,即一個)的整體獲取新的對象基於陣列的斷源數據和b)完成後運行一個操作各個運營商。

任何幫助極大的讚賞。

謝謝

  • S.阿羅拉

- 更新:工作最終版本在此基礎上回答以下有輕微的語法修復:

this.sub = this.dataService.getUserData() 
    .map((data: any[]) => { 
     return data.map((x: any) => { 
      return { value: x._id, viewValue: x.firstName + ' ' + x.lastName }; 
     }); 
    }) 
    .subscribe((data: any) => { 
     this.userDropDown = data; 
     this.patchFormData(); 
    }, 
    (error) => console.log("error", error) 
    ); 
+0

是'this.dataService.getUserData()'返回一個數組? – CozyAzure

回答

1

其實,你根本不需要.switchMap()。您只是使用Observable.from()創建多個排放,除非您真的想逐個更新下拉值,否則這是完全不必要的。

你可以做的只是返回數組,使用.map()來轉換數組,然後將其分配給下拉值列表。現在

this.sub = this.dataService.getUserData() 
//this map is a function of Observable 
    .map((data: any[]) => { 
     //this map is a function of array, not observable. 
     //use this to transform the data 
     return data.map(x => ({value: x._id, viewValue: x.firstName + ' ' + x.lastName})) 
    }) 
    .subscribe((data) => { 
      //assign your values to your dropdown list, and not pushing it one by one. 
      this.userDropDown = data; 
      this.patchFormData(); 
     }, 
     (error) => console.log("error", error) 
    ); 

,你只有一個發射在你的觀察,(這是API調用),然後在你的.subscribe()功能,您this.userDropDownthis.patchFormData()都將只運行一次。

+0

不幸的是,.switchmap服務需求.. getUserData調用依賴於graphql,它爲我提供了一個單獨的用戶集合。 switchMap將該單個集合轉換爲單獨發射的項目(每個用戶一個),然後我可以使用映射一個一個地轉換。我想過使用lodash來處理整個系列,但如果可能的話,我試圖堅持使用RxJs的方法。 – sarora

+0

@sarora正是我的答案的重點,你**不需要通過觀察者一個接一個地轉換它們。您可以使用數組的['.map'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)來轉換它們。 – CozyAzure

+0

謝謝!我沒有想到要在RxJs管道內用常規的.map操作符操作集合..非常漂亮!一旦我開始使用.switchmap方法,就會讓連鎖操作變得不必要地困難。 – sarora

相關問題