我正在使用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拒绝吗?” 这些警告起着重要的作用,但要查看其工作原理,请参见以下示例: 尝试这个: 或这个: 或这个: 免责