Javascript 在typescript中编写if..else块的更好方法是在两者之间使用网络调用

Javascript 在typescript中编写if..else块的更好方法是在两者之间使用网络调用,javascript,typescript,if-statement,Javascript,Typescript,If Statement,我发现自己写了很多这样的代码 if(cond){ /*do some network call */ this.networkService.invoke(params).subscribe((res) => { this.doSomething(); }) }else{ /* do something without calling the network */ this.doSomething(); } 本质上,this.doSomethin

我发现自己写了很多这样的代码

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()
。有没有更好的方法来编写这样的代码?

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

async parentFunction(){
...
cond&&wait this.networkService.invoke(params.toPromise)()
这个。doSomething();

}
也许这不是你要问的,但大多数时候(IMHO)这类代码的问题在于有时是同步的,有时是异步的。为了避免这种情况,您可以使用
rxjs
操作符
,始终采用异步方式

我最近在缓存服务上做了类似的事情。这里的想法是,即使数据已经加载,也始终返回一个可观察的

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;
}
私有数据:SomeData[]=null;
private IsLoadedOnitsWay=false;
私有主题:主题=新主题();
构造函数(私有数据服务:数据服务){}
public getAll():可观察{
如果(!this.isLoadedOnitsWay){
this.isLoadedOnitsWay=true;
this.dataService.getData().subscribe(x=>{
//从服务加载。。。
这个数据=x;
本.主题.下一(x);
});
}else if(this.data){
//从缓存中获取
返回(此数据);
}
//返回主题并等待加载数据
返回此.subject;
}

我想这是一个可观察的模式,我对这方面没有太多经验,但如果有一个承诺,这个模式看起来会像:
const p=cond?this.nS.invoke():Promise.resolve();p、 然后(()=>this.doSomething())。换句话说,不管用哪种方式构造一个承诺,然后用哪种方式异步解析
doSomething
。这几乎就是答案,但我建议只使用
if
语句,而不要滥用
&&
古怪。@H.B.是的,我同意。使用
if
语句可以使代码更加可读和简单。