异步诺言尝试捕获等待返回混乱

时间:2019-06-09 08:19:10

标签: typescript function asynchronous promise

我一直难以掌握异步功能的概念以及如何正确实现它们。

在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用一种非常简单的方式解释异步功能的

Await vs Return vs Return Await

And further detail here from the same author

1 个答案:

答案 0 :(得分:1)

首先将返回内容放在catchthen回调中。另外,除了返回值外,您什么也不做,这意味着您可以直接返回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做出承诺时,表达式的返回值是值,而不是承诺
  • 如果{promise被拒绝,则await版本的函数将引发错误,这意味着如果拒绝promises,则该函数的返回值(一个Promise)将引发(无需尝试/捕获,因为您只是在传递错误)
  • async关键字“允许”该函数,因此该函数的返回仍然是Promise(即使response是该函数内部的值)