当前位置: 首页 > 面试题库 >

我应该在异步函数中引发错误还是返回被拒绝的承诺?

岳曦
2023-03-14
问题内容

我正在使用AWS JS SDK提供的承诺。创建包装AWS开发工具包的异步函数时的要点如下:

module.exports.myCustomFunction = input => {

    if (badInput) {
        throw new Error('failed') // <-- This is they key line
    }

    return sns.createTopic(someParams).promise()
}

// The caller looks like this:
myModule.myCustomFunction(someInput).then(result => {
    // carry on
})
.catch(err => {
    // do something with the error
})

有人联系我,他说我永远不要在这类基于promise的函数中抛出错误。他们建议Promise.reject('failed')改为返回。老实说,我对承诺的了解还不是很深,所以他们的解释有点让我震惊。


问题答案:

他们是正确的。

调用myCustomFunction假定始终都会返回一个承诺(.then并分别.catch处理已解决和拒绝的承诺)。当您引发错误时,该函数不会返回promise。

可以 使用它来捕获错误:

try {
  myModule.myCustomFunction(someInput).then(result => {
    // carry on
  })
  .catch(err => {
    // do something with the error
  })
} catch(err) {
  ...
}

但正如您所看到的,这将导致两个错误处理程序:try/catch同步引发的错误,以及可能返回的.catch任何被拒绝的承诺sns.createTopic(someParams)

这就是为什么最好使用Promise.reject()

module.exports.myCustomFunction = input => {

    if (badInput) {
        return Promise.reject('failed');
    }

    return sns.createTopic(someParams).promise()
}

然后,.catch将捕获两种类型的错误/拒绝。

注意:对于较新版本的Node.js(我认为v7.6及更高版本),以下内容也将起作用:

module.exports.myCustomFunction = async input => {

    if (badInput) {
        throw new Error('failed');
    }

    return sns.createTopic(someParams).promise()
}

这里的关键是async关键字。通过使用此关键字,函数结果将自动由Promise包装(类似于@peteb的答案所示)。



 类似资料:
  • 我在异步代码中使用async await,并希望将错误冒泡到异步函数中,该函数调用其中的另一个异步函数。我尝试了这个方法,效果很好,但是如果我在catch块iniside hi()中返回Promise.reject(新错误(“hi失败”))会更好吗?或者有更好的方法来实现这一点吗?

  • 我有一个异步函数,它将一些数据插入数据库(使用Mariadb)。由于重复的唯一键,此插入可能会失败,因此它会抛出错误(实际上确实如此),但当我尝试再次抛出它以通过Promise捕获它时,它不起作用;它似乎总是以成功的案例结束,即使它抛出了错误。 我尝试改变then/catch顺序,我使用了< code > reject(err);而不是< code >抛出err但是这些都不起作用。 这是POST声

  • 问题内容: 我发现自己同意返回接口而不是具体的类。 原因很简单,我要松散耦合。 但是还会有其他影响或权衡吗? 问题答案: 对于List或ArrayList之类的类型,不应进行任何编译,并且应将List提升Code返回到接口。 如果这是通过诸如CopyOnWriteArrayList之类的并发包进行的,并且您使用的是addIfAbsent之类的方法(未在List接口中定义),您将发现自己受到限制。

  • 我发现自己同意返回一个接口,而不是一个具体的类。

  • 问题内容: 当我使用Node运行此代码时,它会在控制台中引发错误(甚至首先显示文本)。 但是,当我将方法链接到方法时,错误消失了: 难道第一个代码不应该处理拒绝吗? 我还尝试了Chrome中的第一个代码,当我在新标签页(或google.com)中打开检查器时,该代码就可以使用。如果我在其他任何页面中,则会引发异常。有什么解释吗?这对我来说真的很奇怪! 问题答案: 为了被视为已处理,被拒绝的诺言应与

  • 问题内容: 我刚刚安装了Node v7.2.0,并了解了以下代码: 结果消息: 我理解这背后的原因,因为许多程序员可能经历了最终被吞噬的沮丧。但是然后我做了这个实验: 结果是: 我基于 异步处理拒绝的 想法 /可能是一件坏事。 但是为什么呢? 问题答案: “我应该避免异步处理Promise拒绝吗?” 这些警告起着重要的作用,但要查看其工作原理,请参见以下示例: 尝试这个: 或这个: 或这个: 免责