Javascript 控制程序流
我有start(),只想在getCityInformation()完全完成后继续编写代码。控制台应打印('getCityInformation'=>'done'=>'finished')。我如何控制这个流程Javascript 控制程序流,javascript,typescript,Javascript,Typescript,我有start(),只想在getCityInformation()完全完成后继续编写代码。控制台应打印('getCityInformation'=>'done'=>'finished')。我如何控制这个流程 async start() { await this.getCityInformation().then(() => console.log('done')); console.log('finished'); } async getCityInformation()
async start() {
await this.getCityInformation().then(() => console.log('done'));
console.log('finished');
}
async getCityInformation() {
this.apiService.getProductsByCategory(this.city.CategoryID)
.subscribe((data: Product[]) => {
console.log('getCityInformation')
this.products = data;
},
(err) => console.log(err),
() => this.loadActivities()
);
}
您当前的
done
、finished
和getCityInformation
顺序是有意义的,因为在异步getCityInformation()
中,您实际上会立即返回(例如,不要等待什么)。这条链条是这样的:
start()
调用getCityInformation()
getCityInformation()
订阅一个可观察对象并返回
getCityInformation()
现在完成,并且start()
打印done
start()
打印finished
getCityInformation()
中的回调获取更新并打印getCityInformation
要解决这个问题,您需要在getCityInformation()
中等待,直到您准备好了可观察的对象。例如,您可以返回一个承诺
,当您拥有所需的所有数据时,该承诺就会实现
你需要回报承诺等待结果
getCityInformation
函数
它现在打印什么?它打印('done'=>'finished'=>'getCityInformation')这是因为getProductsByCategory()也是异步的。我想你也可以等着。或者,如果该方法返回承诺,则将该承诺作为getCityInformation方法的返回返回(即返回this.apiService.getProductsByCategory)(
。。。etc@viiskis如果您在this.apiService.getProductsByCategory
之前添加return
关键字,会有帮助吗?您应该真正解释您的答案,而不仅仅是转储代码。您所做的更改可能并不明确,或者更重要的是,为什么要这样做。如果更改如此明显,OP可能就不知道了首先是这个问题。@ADyson,我认为代码是自我解释的,但我也会在这里写文章,这是其中的一半。你已经做了“什么”而不是“为什么”。只有当你对异步代码理解得很好时,这才是自明的。显然OP对此有点纠结。所以你也应该解释一下你建议背后的概念。
async start() {
await this.getCityInformation().then(() => console.log('done'));
console.log('finished');
}
async getCityInformation() {
return new Promise((resolve, reject) => {
this.apiService.getProductsByCategory(this.city.CategoryID)
.subscribe((data: Product[]) => {
console.log('getCityInformation')
this.products = data;
resolve(data)
},
(err) => reject(err) ,
() => this.loadActivities()
);
})
}