在节点中,我习惯于使用回调来处理错误。
我正在尝试跳转到异步... await,它使用了一种我不习惯的错误处理方法。
我想知道,当调用throw时,是刚执行的throw语句下面的代码吗?换句话说,我是否需要这样做......
async fetch() {
if (somethingBad) {
throw new Error('Cannot fetch')
} else {
let result = await this.read(this.get('id'))
return result
}
}
......或者只是为了这样做:
async fetch() {
if (somethingBad) throw new Error('Cannot fetch')
let result = await this.read(this.get('id'))
return result
}
答案 0 :(得分:6)
在ES6中,当调用throw时,是否会执行throw语句正下方的代码?
不,不是。在异步函数中,throw
表示立即返回被拒绝的承诺。这就像这样做:
return Promise.reject(new Error('cannot fetch'));
它立即退出您的函数并返回被拒绝的承诺,其原因设置为您在throw
使用的任何值。
关于async
函数的一个好处是它们会自动捕获异常并将它们变成被拒绝的promise,因为async
函数的契约是它总是返回一个promise。
仅供参考,在非同步功能中(例如只是常规功能),其余功能也不会执行。该功能立即暂停。你抛出了一个异常,它会在调用链中向上传播,直到找到异常处理程序或顶层(它将是一个未处理的异常)。