我喜欢Async/AwaitTypescript等中提供的新功能的平坦性。但是,我不确定我是否必须await在try...catch块的外部声明要输入的变量以便以后使用,这一点我不确定。像这样:
Async/Await
await
try...catch
let createdUser try { createdUser = await this.User.create(userInfo) } catch (error) { console.error(error) } console.log(createdUser) // business // logic // goes // here
如果我错了,请纠正我,但是似乎最好的做法是不要在try主体中放置多行业务逻辑,因此,我只剩下createdUser在块外声明,在块中分配,以及然后使用它。
try
createdUser
在这种情况下,最佳做法是什么?
似乎最好的做法是不要在try主体中放置多行业务逻辑
其实我会说是的。通常,您需要使用该值来处理catch 所有 异常:
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 }
如果您只想抓住并处理承诺中的错误,则有三种选择:
在外部声明变量,然后根据是否存在异常进行分支。可以采用多种形式,例如
return
throw
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 }
var
测试捕获到的异常的类型,然后根据该异常进行处理或重新抛出。
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
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。
break
continue