2017-05-25 64 views
0

我想檢查條件(數據在存儲器中可用還是從api獲取數據)是true/false,然後調用相應的函數,其結果是傳遞。檢查Observable和執行/返回函數的條件(angular2,rxjs)

現在,我正在檢查這個組件,但我想把它移到服務端。

service.ts

getData() { 
// check source of data to return... 
    return this.hasLocal().subscribe((res) => { 
     if (res === 0) // no data in storage 
      return this.getRemote(); // <-- I want to return this 
     else 
      return this.getLocal(); // <-- or this to the component. 
    }) 
} 

getRemote() { 
    console.log('getRemote()'); 
    return this.api.get(this.apiEndpoint).map(
     res => { 
      let resJson = res.json(); 
      // save data to storage: 
      this.storage.set(this.storageName, JSON.stringify(resJson)) 
       .then(() => console.log('Data saved in storage.')) 
       .catch(() => console.warn('Error while saving data in storage.')); 

      return resJson; 
     }); 
} 

getLocal() { 
    console.log('getLocal()'); 
    let promise = this.storage.get(this.storageName).then(res => { 
     return res; 
    }); 
    return Observable.fromPromise(promise).map(res => { 
     return JSON.parse(res); 
    }); 
} 

hasLocal() { 
    let promise = this.storage.length().then(res => res); 
    return Observable.fromPromise(promise).map(res => res); 
} 

GetData()是所謂的組件,然後將結果寫入到陣列contacts

component.ts

loadData() { 
    this.contactsProvider.getData().subscribe(
     contacts => { 
      console.log(contacts); 
      this.initializeData(contacts); 
      this.loader.dismiss(); 
     } 
    ); 
} 
+0

這看起來不正確。可悲的是,我並不擅長觀察事件,但我認爲這裏的關鍵是RxJs方法之一,而不是訂閱中的邏輯if語句。必須有一些能夠使用反應模式來處理這種情況。 – cgTag

回答

1

可以使用mergeMapflatMap是rxjs4別名)運營商這樣的:

getData() { 
// check source of data to return... 
    return this.hasLocal().mergeMap((res) => { 
     if (res === 0) // no data in storage 
      return this.getRemote(); // <-- I want to return this 
     else 
      return this.getLocal(); // <-- or this to the component. 
    }) 
} 

flatMap文檔:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-mergeMap

您可以導入它與import 'rxjs/add/operator/mergeMap';

+1

謝謝.. :)我必須閱讀更多關於RxJS .. :) – Lyczos