【问题标题】:async promise try catch await return confusion异步承诺尝试捕获等待返回混乱
【发布时间】:2019-10-24 01:33:40
【问题描述】:

我一直无法理解异步函数的概念以及如何正确实现它们。

在 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);
});

更新

在发布这个问题之前我应该​​休息一下,因为它从一开始就有缺陷。

所以我想添加一个更新以避免让遇到类似问题的其他人感到困惑并因此到达这里。

首先感谢@MicheleLambertucci 花时间澄清并提供可靠的答案。

其次,我想分享以下链接,IMO 以非常简单的方式解释了异步函数。

Await vs Return vs Return Await

And further detail here from the same author

【问题讨论】:

  • 编写一个没有 await 的异步函数是没有意义的,在 no-op then 或在 doSomething 中的 catch 中也没有任何意义。另请注意,Angular 中的规范异步抽象是 observables,而不是 Promise。
  • “因为我在这里结束了 14 小时的编码弯曲” 我想你应该休息一下,这不健康。
  • 没错...只是完全筋疲力尽。

标签: typescript function asynchronous promise


【解决方案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-ed 函数会抛出错误,这意味着如果 promise 被拒绝,则此函数的返回值(Promise)会抛出(无需尝试/捕获,因为您只是传递了错误上)
  • async 关键字“承诺”函数,因此函数的返回仍然是 Promise(即使 response 是函数内部的值)

【讨论】:

  • 实际上我想说 await 的可读性稍差 - 使用 async 函数,从调用者的角度返回值还是 promise 都无关紧要。如果您要在异步函数内部进行更多处理(对等待的值或捕获),只会有区别。
  • 一个没有awaitasync 函数没有任何意义。
  • @jonrsharpe 我明白你在说什么,但你会得到相同的结果——在我看来——更干净的方式只是直接返回 Promise 对象而不使用 async 关键字。我更新了我的答案以表明这一点。
  • 好的,@MicheleLambertucci 首先,感谢您抽出宝贵的时间,您的注释“当您等待承诺时,表达式的返回是价值,而不是承诺”帮助我得到对事情的把握......我可能需要休息,哈哈。
  • .... 和 ... 是的... 它确实作为一个承诺返回。呃,在将这个问题发布给 SO 之前,我应该休息一下。再次感谢所有花时间回复的人。
猜你喜欢
  • 1970-01-01
  • 2019-03-20
  • 2019-10-20
  • 2020-09-14
  • 2019-07-20
  • 2022-01-09
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多