异步/等待在Angular 8中未按预期工作
我习惯于在Asp.net中使用async/await。我现在需要在ngBootstrap模式服务中进行几个API调用(4)。用户将单击一个按钮打开一个模式。第一个API调用获取模态所需的基本信息。async OpenModal()方法用async修饰,第一个API调用使用async res,如下所示异步/等待在Angular 8中未按预期工作,angular,Angular,我习惯于在Asp.net中使用async/await。我现在需要在ngBootstrap模式服务中进行几个API调用(4)。用户将单击一个按钮打开一个模式。第一个API调用获取模态所需的基本信息。async OpenModal()方法用async修饰,第一个API调用使用async res,如下所示 this.service.findContent(id).subscribe( async res => { //other code var social
this.service.findContent(id).subscribe(
async res => {
//other code
var socialDataResult = await this.getSocialData();
console.log('socialDataResult ', socialDataResult);
//other code
},
async getSocialData() {
let result: SocialData;
this.socialDataService.findSocialData().subscribe(
async res => {
let socialData = new SocialData(res);
console.log('socialData ', socialData);
result = socialData;
return result;
},
err => {
console.log(err);
}
)
return result;
}
我希望代码在写入控制台之前会等待响应从getSocialData返回。按原样,在将控制台日志写入被调用的方法之前,它会将控制台日志写入调用方法的正下方。调用方法中的控制台日志显示“未定义”。正在调用的方法中的控制台日志显示包含所有数据的SocialData对象
还需要注意的是,当我在上面悬停时,请等待这个。getSocialData();,我明白了
(method) ContentComponent.getSocialData(): Promise<SocialData>
(方法)ContentComponent.getSocialData():承诺
非常感谢您的帮助。谢谢
getSocialData
说它是异步的,但实际上它从不等待任何东西。如果您没有利用Observable的任何高级功能,那么最好将findSocialData()
的结果转换为承诺
async getSocialData() {
try {
let res = await this.socialDataService.findSocialData().toPromise();
let socialData = new SocialData(res);
console.log('socialData ', socialData);
return socialData;
} catch(err) {
console.log(err); // you might not actually want to eat this exception.
}
}
我认为您正在混合使用Observable和async/await。 对于您的用例,我建议您只使用可观察的。看起来您有多个呼叫,这些呼叫是链接的,可观察到的帮助您组织呼叫,并以您想要的方式获得响应 您可以查看我的stackblitz,在那里我有一个处理嵌套订阅的解决方案
在这里,处理可观测数据将是一个优雅的解决方案 subscribe()需要一个回调函数,该函数将发出的事件作为参数,但不返回任何内容。从回调函数返回的任何内容都将被忽略。对于从回调返回的承诺,将不会调用then()。我强烈建议你学习可观测数据是如何工作的,并以此为基础,而不是把它们与承诺混为一谈。还有一些关于可观测数据的好教程,你可能需要注意。我喜欢你提出的解决方案,这对我来说很有意义。使用您的方法,您如何等待另一个对象获取ID以进行另一个API调用?另外,您如何读取数据?我假设你的可观测物体中有几个物体。感谢您优雅的解决方案!在这里检查我关于进行另一个API调用的回答。您可以从第一个API获得的响应中读取数据,也可以点击它获取任何中间响应。非常感谢!