This article has not been translated, hope that your can PR to translated it. Help us!

CacheService

Examples

value:

Basic:
Key is valid request:
Notify:
Basic Usage

Simplest of usage.

expand codeexpand code
import { Component, OnDestroy } from '@angular/core';
import { CacheService } from '@delon/cache';
import { NzMessageService } from 'ng-zorro-antd/message';
import { Subscription } from 'rxjs';

@Component({
  selector: 'cache-service-simple',
  template: `
    <p>value: {{ value | json }}</p>
    <div class="pt-sm">
      Basic:
      <button nz-button (click)="srv.set(key, newValue)">Set</button>
      <button nz-button (click)="value = srv.getNone(key)">Get</button>
      <button nz-button (click)="srv.remove(key)">Remove</button>
      <button nz-button (click)="srv.clear()">Clear</button>
    </div>
    <div class="pt-sm">
      Key is valid request:
      <button nz-button (click)="getByHttp()">Get</button>
    </div>
    <div class="pt-sm">
      Notify:
      <button nz-button (click)="registerNotify()">Register</button>
      <button nz-button (click)="unRegisterNotify()">UnRegister</button>
    </div>
  `,
})
export class CacheServiceSimpleComponent implements OnDestroy {
  value: any;
  key = 'demo';
  private notify$?: Subscription;

  get newValue(): number {
    return +new Date();
  }

  constructor(public srv: CacheService, private msg: NzMessageService) {}

  getByHttp(): void {
    this.srv.get(`https://randomuser.me/api/?results=1`).subscribe(res => {
      this.value = res;
    });
  }

  registerNotify(): void {
    if (this.notify$) this.notify$.unsubscribe();
    this.notify$ = this.srv.notify(this.key).subscribe(res => {
      if (res == null) {
        this.msg.success('register success');
        return;
      }
      this.msg.warning(`"${this.key}" new status: ${res.type}`);
    });
  }

  unRegisterNotify(): void {
    this.srv.cancelNotify(this.key);
  }

  ngOnDestroy(): void {
    if (this.notify$) this.notify$.unsubscribe();
  }
}

API

set()

参数名类型描述
keystring缓存唯一标识符
dataany | Observable<any>缓存数据源,数据源为 Observable 时,依然返回 Observable,否则返回 void
options{ type?: 'm' | 's', expire?: number, emitNotify?: boolean }type 存储类型,'m' 表示内存,'s' 表示持久
expire 过期时间,单位

get()

参数名类型描述
keystring缓存唯一标识符
options{ mode?: 'promise' | 'none', type?: 'm' | 's', expire?: number, emitNotify?: boolean }mode 指定获取缓存的模式:
1、promise 表示若不存 key 则把 key 当URL发起请求并缓存且返回 Observable
2、none 表示直接返回数据若KEY不存在则直接返回 null

type 存储类型,'m' 表示内存,'s' 表示持久
expire 过期时间,单位

getNone()

获取缓存数据,若 key 不存在或已过期则返回 null。

tryGet()

获取缓存,若不存在则设置缓存对象,参数等同 set()

has()

是否缓存 key

remove()

移除缓存 key

clear()

清空所有缓存。

notify()

key 监听,当 key 变更、过期、移除时通知,注意以下若干细节:

  • 调用后除再次调用 cancelNotify 否则永远不过期

  • 监听器每 freq (默认:3秒) 执行一次过期检查

cancelNotify()

取消 key 监听

hasNotify()

key 是否已经监听

clearNotify()

清空所有 key 的监听

freq()

设置监听频率,单位:毫秒且最低 20ms,默认:3000ms

gettryGet 的区别

本质都是获取并返回缓存数据,get 相比 tryGet 更简化,前者按KEY即是URL约定的风格,后者需指定数据源对象。

酷操作

async 管道

RxJS 和 async 管道二者的配合可以帮助我们非常友好的使用缓存数据,例如:

@Component({
  template: `<li *ngFor="let unit of units | async">{{unit}}</li>`
})
export class Component {
  units: this.srv.get('/data/unit')
}

缓存与请求

有时需要依赖字典获取远程数据时:

this.srv
  .get('/data/unit')
  .pipe(
    map(units => this.http.get(`/trade?unit=${units}`))
  );