我需要使用RxJ和Observables维护无状态服务。所以我做到了:
[注意:在这里,我需要以响应方式生成工作订单号,并将其存储在LocalStorage上,以避免在浏览器刷新/ App Killed用例中出现编号丢失。
我的疑问是,我在执行创建无状态服务的正确方法吗?如果不是,最好的方法是什么?
注意:一切正常。但是我需要知道我在这个架构上是否正确?
work-orders-data.Service.ts
@Injectable({
providedIn: 'root'
})
export class WorkOrdersDataService {
private workOrderNumber: number = 1;
private workOrderNumberSubject$: BehaviorSubject<number> = new BehaviorSubject<number>(this.workOrderNumber);
workOrderNumberChanged$: Observable<number> = this.workOrderNumberSubject$.asObservable();
constructor(
private storage: Storage,
) { }
setDefaultWorkOrderNumber(workOrderNumber: number): void {
this.workOrderNumber = workOrderNumber;
}
setWorkOrderNumber(): void {
this.workOrderNumber += 1;
this.workOrderNumberSubject$.next(this.workOrderNumber);
this.storage.set(LocalStorageConstant.WORK_ORDER_NUMBER, this.workOrderNumber);
}
}
app.component.ts
async initializeApp(): Promise<void> {
this.workOrdersDataService.setDefaultWorkOrderNumber(Number(await this.storage.get(LocalStorageConstant.WORK_ORDER_NUMBER)));
}
work-order.component.ts
createWorkOrder(): void {
this.workOrdersDataService.setWorkOrderNumber(); // to generate new work order no.
this.workOrdersDataService.workOrderNumberChanged$.subscribe((res: number) => {
const workOrderNumber: string = environment.companyEnvironment.workOrderPrefix + res; // work order no. creation
});
}
体系结构良好且合法。
如果要扩展反应性方法,则将initializeApp
转换为Observable
。
无需在此处使用Promise。
毕竟,Observables的强大之处在于它们在多个API上的全局API抽象。 (Promise / Fetch / Regular数据结构,例如数组/等)
我要做的是:
initializeApp(): Observable<any> {
return from(Number(this.storage.get(LocalStorageConstant.WORK_ORDER_NUMBER))).pipe(take(1)); // take(1) for auto completion.
}
然后在app.component.ts中的ngOnInit
中订阅它,您可以并且应该调用this.workOrdersDataService.setDefaultWorkOrderNumber
注意这里没有,因为它将缺少订阅函数参数。
[另外,它可能不直接与这个问题有关,但是我会考虑在数据服务中将publishBehavior
与refCount
(用于自动订阅计数的refCount)一起考虑,以便对主题的直接声明进行更“现代”的覆盖。 (还允许您使用其。connect方法来决定何时激活主题,而不是在数据服务中预先分配它。)