创建可观察到的无状态服务角度RxJ的正确方法

问题描述 投票:0回答:1

我需要使用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

      });

      }
angular typescript ionic-framework rxjs observer-pattern
1个回答
0
投票

体系结构良好且合法。

如果要扩展反应性方法,则将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

注意这里没有,因为它将缺少订阅函数参数。

[另外,它可能不直接与这个问题有关,但是我会考虑在数据服务中将publishBehaviorrefCount(用于自动订阅计数的refCount)一起考虑,以便对主题的直接声明进行更“现代”的覆盖。 (还允许您使用其。connect方法来决定何时激活主题,而不是在数据服务中预先分配它。)

© www.soinside.com 2019 - 2024. All rights reserved.