javascript - RxJS 5 Observable 和 Angular2 http : Call ajax once, 保存结果,后续ajax调用使用缓存结果

标签 javascript ajax angular rxjs5

下面的代码是我目前拥有的代码的简化版本:

name.service.ts

@Injectable()
export class NameService {

    const nameURL = "http://www.example.com/name";

    getName() {
        return this.http.get(nameURL);
    }
}

name1.component.ts

@Component({
    templateUrl: './name1.component.html',
    styleUrls: ['./name1.component.css']
})
export class Name1Component implmenets OnInit {

    private name1;

    constructor(
        private nameService: NameService
    ){}

    ngOnInit() {
        this.setupName();
    }

    private setupName() {

        this.nameService.getName()
            .subscribe(
                resp => this.name1 = resp,
                error => this.name1 = "unknown"
            );
    }
}

name2.component.ts

@Component({
    templateUrl: './name2.component.html',
    styleUrls: ['./name2.component.css']
})
export class Name2Component implmenets OnInit {

    private name2;

    constructor(
        private nameService: NameService
    ){}

    ngOnInit() {
        this.setupName();
    }

    private setupName() {

        this.nameService.getName()
            .subscribe(
                resp => this.name2 = resp,
                error => this.name2 = "unknown"
            );
    }
}

这里是我想做的,name1.component.ts会先调用NameService类的getName方法。 getName 将进行 ajax 调用并返回一个可观察对象。

接下来,name2.component.ts也会调用NameService类的相同的getName方法,而getName 也将执行相同的 ajax 调用并返回一个 observable。

是否可以使用 rxjs,当 NameService 中的 getName 方法进行第一次 ajax 调用时,它会存储 ajax 调用的结果.对 getName 方法的任何后续函数调用都将返回第一个 ajax 调用的缓存结果,并且不会执行另一个冗余的 ajax。

最佳答案

你可以多次订阅 Observable,所以如果你只想保存两个组件之间共享数据的第二个网络请求,你可以像这样在你的服务中缓存它:

@Injectable()
export class NameService {

    const nameURL = "http://www.example.com/name";
    private cache: Observable<any>;

    getName() {
        return this.cache || this.cache = this.http.get(nameURL);
    }
}

关于javascript - RxJS 5 Observable 和 Angular2 http : Call ajax once, 保存结果,后续ajax调用使用缓存结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41551280/

相关文章:

javascript - 使用多个下拉列表在单个 View 中过滤具有两个模型的数据表

javascript - 如何在不使用循环的情况下使皮亚诺加法算法起作用?

javascript - 使用带有 ajax 的 SVG 为 IO 硬件的状态设置动画

javascript - 如何在网络浏览器中显示实时数据?

javascript - 拖动事件不以 Angular 2 触发

javascript - Angular 6 中的自定义单选按钮选择错误(在 ngFor 内部)

javascript - 图片src改变时如何重新绑定(bind)$(image).load()?

javascript - 没有JQ如何将图像随机放入单元格?

ajax - 在 Laravel 5.5 上使用 axios 发布请求

angular - 将 SonarTS 质量配置文件与 tslint.json Angular 项目同步