2016-09-29 157 views
0

我正试图用反应式编程方法来包装我的逻辑。Angular 2 Observables implementation

我有两个依赖数据集可能或可能不在本地存储。不过,我需要先计算一个,然后计算第二个。

因此,像这样:

let storageCategories = this.ls.retrieve('categories'); 
if (storageCategories) { 
    // Found in localStorage 
    this.allCategories = storageCategories; 
} else { 
    // Send an HTTP API request and fetch categories 
    // After request is successful lookup for 'result' in localstorage 
    // If result not in localstorage send an HTTP API request 
} 


// RESULT LOGIC 
let storageResult = this.ls.retrieve('result'); 
if (storageResult) { 
    // Found in localStorage 
    return new BehaviorSubject<any>(this.processResultData(storageResult)); 
} else { 
    // Send an HTTP API request and fetch result 
    // If request is successful save in localstorage and return 
} 

现在的基本问题是我不想写在两个地方的结果逻辑:(1)第一ifelse和(2)后的类别if

有没有办法让结果逻辑只在一个地方(除了写入一个新的函数)?

+0

在'storageResult'的第二个else中,您是否向同一端点发出一个http请求,以至于'storageCategories'? – lbrahim

+0

不,storageResults HTTP请求用于另一个API调用。为了澄清:我需要首先检查类别。如果它们在本地存储中可用,则会使用这些值。如果不是,则将发送针对类别的API请求。在这两种情况下,我都必须检查localstorage中的'results'值。如果它存在,那么我们使用它,否则我们需要发送一个API请求来使用另一个API调用收集结果。因为这些调用是异步的,所以他们做了一个嵌套的回调混乱,我试图避免并希望使用RxJS方法编写代码。我希望它稍微澄清一下这个问题。 – Hassan

+0

请在下面查看我的答案。 – lbrahim

回答

0

我从你的解释中提出plunkr here。看看它是否符合你的标准并解决你的问题。这里是总结:

private getCategories(): Observable<any>{ 
if(this.categoriesInLs){ 
    return Observable.of("categories data"); 
} else { 
    return this.searchService.getCategories(); 
} 
} 

private getResults(): Observable<any>{ 
    if(this.resultsInLs){ 
    return Observable.of("results data"); 
    } else { 
    return this.searchService.getResults(); 
    } 
} 

get(){ 
    this.getCategories() 
    .flatMap(categories => this.getResults()) 
    .subscribe(r => console.log(r)); 
} 
+0

谢谢易卜拉欣! - 我会测试它,让你知道:)我不知道'Observable.of'方法。所以基本上你已经分解了依赖关系,然后在一个单独的方法('get()')中重新加入它们。不错的做法:) – Hassan

+0

也可以做一个例程,但这将是丑陋的 – lbrahim