我一直难以掌握异步功能的概念以及如何正确实现它们。
在Angular应用程序中,我在正确解析的服务中具有以下功能,但对于此实现是否错误感到困惑,如果没有,是否有更好的方法可以将它们全部编写在一起。
为简化起见而简化的功能:
async doSomething(param:string): Promise<any> {
this.activeParam = param;
return this.doSomethingElse(param).then((response)=> {
return Promise.resolve(response);
}).catch((error) =>{
return Promise.reject(error);
});
}
然后我在组件中调用该函数,如下所示:
this.service.doSomething('setting').then((result) =>{
console.log('success:', result);
},(error)=>{
console.log('error:', result);
});
更新
在发布此问题之前,我应该先休息一下,因为它从一开始就是有缺陷的。
所以id喜欢添加更新,以避免使遇到类似问题的其他人感到困惑,并因此而来到这里。
首先感谢@MicheleLambertucci抽出时间澄清并提供了可靠的答案。
第二,id喜欢分享以下链接,这是IMO用一种非常简单的方式解释异步功能的
答案 0 :(得分:1)
首先将返回内容放在catch
和then
回调中。另外,除了返回值外,您什么也不做,这意味着您可以直接返回promise:
doSomething(param: string): Promise<any> {
this.activeParam = param;
return this.doSomethingElse(param);
}
话虽如此,由于您正在使用async
函数,因此可以使用await
重写此函数。我认为,这将导致更好的可读性代码。
async doSomething(param: string): Promise<any> {
this.activeParam = param;
const response = await this.doSomethingElse(param);
return response;
}
此重构中有一些注意事项:
await
做出承诺时,表达式的返回值是值,而不是承诺await
版本的函数将引发错误,这意味着如果拒绝promises,则该函数的返回值(一个Promise)将引发(无需尝试/捕获,因为您只是在传递错误)async
关键字“允许”该函数,因此该函数的返回仍然是Promise(即使response
是该函数内部的值)