为了账号安全,请及时绑定邮箱和手机立即绑定

在打字稿中编写 if..else 块并在其间进行网络调用的更好方法

在打字稿中编写 if..else 块并在其间进行网络调用的更好方法

繁花不似锦 2023-05-25 18:06:12
我发现自己写了很多这样的代码;if(cond){   /*do some network call */   this.networkService.invoke(params).subscribe((res) => {      this.doSomething();   })}else{   /* do something without calling the network */   this.doSomething();}本质上,this.doSomething();无论是否满足条件都必须调用。如果cond === true,则进行一些网络调用,然后this.doSomething()。有没有更好的方法来编写这样的代码?
查看完整描述

2 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

通过将您的 observable 转换为 promise 并使父函数异步,您可以这样做:


async parentFunction() {

    ...

    cond && await this.networkService.invoke(params).toPromise()

    this.doSomething();

}


查看完整回答
反对 回复 2023-05-25
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

也许这不是你要问的,但大多数时候(恕我直言)这种代码的问题是它有时是同步的,有时是异步的。为避免这种情况,您可以使用rxjs运算符of始终采用异步方式。


我最近用缓存服务做了类似的事情。这里的想法是Observable即使数据已经加载,也总是返回一个;


private data: SomeData[] = null;

private isLoadedOrOnItsWay = false;

private subject: Subject<SomeData[]> = new Subject<SomeData[]>();


constructor(private dataService: DataService) { }


public getAll(): Observable<SomeData[]> {

    if (!this.isLoadedOrOnItsWay) {

        this.isLoadedOrOnItsWay = true;

        this.dataService.getData<SomeData[]>().subscribe(x => {

            // Load from service...

            this.data = x;

            this.subject.next(x);

        });

    } else if (this.data) {

        // Get from cache

        return of(this.data);

    }


    // Return subject and wait for data to be loaded

    return this.subject;

}


查看完整回答
反对 回复 2023-05-25
  • 2 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信