在ES6中,当调用throw时,是否会执行throw语句下面的代码?

时间:2018-01-30 03:36:05

标签: javascript ecmascript-6

在节点中,我习惯于使用回调来处理错误。

我正在尝试跳转到异步... 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
}

1 个答案:

答案 0 :(得分:6)

  

在ES6中,当调用throw时,是否会执行throw语句正下方的代码?

不,不是。在异步函数中,throw表示立即返回被拒绝的承诺。这就像这样做:

return Promise.reject(new Error('cannot fetch'));

它立即退出您的函数并返回被拒绝的承诺,其原因设置为您在throw使用的任何值。

关于async函数的一个好处是它们会自动捕获异常并将它们变成被拒绝的promise,因为async函数的契约是它总是返回一个promise。

仅供参考,在非同步功能中(例如只是常规功能),其余功能也不会执行。该功能立即暂停。你抛出了一个异常,它会在调用链中向上传播,直到找到异常处理程序或顶层(它将是一个未处理的异常)。