javascript - 检查 Observable 的条件并执行/返回函数(angular2、rxjs)

标签 javascript angular rxjs observable

我想检查条件(数据是否在存储中可用或从API获取数据)是否为真/假,然后调用传递结果的相应函数。

现在,我正在组件中检查这一点,但我想将其移至服务端。

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

组件.ts

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

最佳答案

您可以使用 mergeMap(flatMap 是 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'; 导入它

关于javascript - 检查 Observable 的条件并执行/返回函数(angular2、rxjs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44179378/

相关文章:

javascript - 带有面包屑的 Angular 6 过滤器显示错误

javascript - 从可观察同步获取数据。 Angular

javascript - Promise中间件

javascript - 对 js 文件进行分组返回奇怪的 js 错误

javascript - 基于子 div 的样式标签

javascript - 如何链接javascript图像中的url

node.js - 使用 Node 进行图像处理

Angular 4 - 带参数的激活路线

json - 如何显示自定义验证错误消息

订阅主题的 Angular HTTP 调用关闭主题