一尘不染

使用Async / Await正确尝试…捕获语法

javascript

我喜欢Async/AwaitTypescript等中提供的新功能的平坦性。但是,我不确定我是否必须awaittry...catch块的外部声明要输入的变量以便以后使用,这一点我不确定。像这样:

let createdUser
try {
    createdUser = await this.User.create(userInfo)
} catch (error) {
    console.error(error)
}

console.log(createdUser)
// business
// logic
// goes
// here

如果我错了,请纠正我,但是似乎最好的做法是不要在try主体中放置多行业务逻辑,因此,我只剩下createdUser在块外声明,在块中分配,以及然后使用它。

在这种情况下,最佳做法是什么?


阅读 356

收藏
2020-04-25

共1个答案

一尘不染

似乎最好的做法是不要在try主体中放置多行业务逻辑

其实我会说是的。通常,您需要使用该值来处理catch 所有 异常:

try {
    const createdUser = await this.User.create(userInfo);

    console.log(createdUser)
    // business logic goes here
} catch (error) {
    console.error(error) // from creation or business logic
}

如果您只想抓住并处理承诺中的错误,则有三种选择:

  • 在外部声明变量,然后根据是否存在异常进行分支。可以采用多种形式,例如

    • catch块中的变量分配一个默认值
    • return早期或重新throw从异常catch
    • 设置一个标志,该catch块是否捕获到异常,并在一定if条件下对其进行测试
    • 测试要分配的变量的值

      let createdUser; // or use var inside the block
      try {
      createdUser = await this.User.create(userInfo);
      } catch (error) {
      console.error(error) // from creation
      }
      if (createdUser) { // user was successfully created
      console.log(createdUser)
      // business logic goes here
      }

  • 测试捕获到的异常的类型,然后根据该异常进行处理或重新抛出。

    try {
    const createdUser = await this.User.create(userInfo);
    // user was successfully created
    console.log(createdUser)
    // business logic goes here
    

    } catch (error) {
    if (error instanceof CreationError) {
    console.error(error) // from creation
    } else {
    throw error;
    }
    }

不幸的是,标准JavaScript(仍然)不支持条件异常的语法。

  • 使用then两个回调,而不是try/catch。这确实是最丑陋的方式,我个人的建议也是出于其简单性和正确性,而不是依靠标记的错误或结果值的外观来区分对承诺的实现和拒绝:
    await this.User.create(userInfo).then(createdUser => {
    // user was successfully created
    console.log(createdUser)
    // business logic goes here
    

    }, error => {
    console.error(error) // from creation
    });

当然,它带有引入回调函数的缺点,这意味着您不能像从外部函数那样轻松地break/continue循环或执行早期操作return

2020-04-25