gpt4 book ai didi

typescript - 按顺序执行

转载 作者:搜寻专家 更新时间:2023-10-30 21:25:17 24 4
gpt4 key购买 nike

如何在 typescript 中以清晰的方式执行依赖于序列的可观察方法?

例子:

Init(){
this.methodThatUseObservable();
this.methodThatShouldExecuteAfter();
this.anotherMethod();
... (continue)
}

在每个方法中,我都有一个可观察的方法并订阅。

methodThatUseObservable(){
this.service1.get().subscribe(
(value1) => {
this.value1 = value1;
}
)
}
methodThatShouldExecuteAfter(){
this.service2.get(this.value1).subscribe( //depends on the first
(value2) => {
this.value2 = value2;
}
)
}
anotherMethod(){
this.service3.get(this.value2).subscribe( //depends on the second
(value3) => {
this.value3 = value3;
}
)
}
...(so on)

我当然可以:

Init(){
this.methodThatUseObservable();
}

在每个方法中,其他方法依赖于:

methodThatUseObservable(){
this.service1.get().subscribe(
(value1) => {
this.value1 = value1;
this.methodThatShouldExecuteAfter();
}
)
}
methodThatShouldExecuteAfter(){
this.service2.get(this.value1).subscribe( //depends on the first
(value2) => {
this.value2 = value2;
this.anotherMethod();
}
)
}
anotherMethod(){
this.service3.get(this.value2).subscribe( //depends on the second
(value3) => {
this.value3 = value3;
...(and so on)
}
)
}

但是我感觉不是很清楚,这样我觉得顺序不是很清楚。

也许解决方案是返回一个 promize 并执行 then 方法?

    this.methodThatUseObservable().then(()=>{
this.methodThatShouldExecuteAfter();
}).then(()=>{
this.anotherMethod();
})

我不知道这样的结构更改是否可行,请帮忙。

最佳答案

我不确定这在您的示例中是否是最佳实践,但是,我所做的是将每个方法包装在一个 promise 中,然后使用 async/await 以便以可读的方式链接它们。例如,在 Angular 中:

async ngOnInit(){
try{
await this.methodThatUseObservable();
await this.method2();
await this.method3();
console.log("Done");
}
catch(e){
//Handle errors
}
}

methodThatUseObservable() : Promise<{}>{
return new Promise(
(resolve, reject) => {
this.service1.get().subscribe(
value1 => {
this.value1 = value1;
resolve();
},
error => {
reject('Error!');
}
)
}
)
}

...Same for method2, method3

关于typescript - 按顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57893724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com