【发布时间】:2017-11-09 08:57:34
【问题描述】:
我有一个关于异步等待代码的概念性问题:这是我的代码中的一个 sn-p:
async function uploadFileBackup(fileId, versionNumber, filePath, sync) {
//...some irrelevant code
const toReturn = new Promise((accept, reject) => {
s3.upload(params, async function (err, data) {
if (err) {
reject(err)
} else {
//here is the relevant code
file.backupStatus = 'success'
await file.save()
accept(data)
}
})
})
if (sync)
return toReturn
//...some other irrelevant code
}
现在如果行
等待文件.save()
(在承诺成功时发生)失败,然后我的应用抛出 未处理的承诺拒绝,这正是我的问题。
另外,如果传递的 accept 方法抛出异常,promise 将有一个未处理的拒绝。
我可以自然地用 try catch 块包围 else 语句中的代码,但这无济于事,更糟糕的是,它会误导开发人员,因为他会认为错误来自承诺代码 s3.upload,而该部分将成功,而接受代码将是失败的部分:这肯定会产生不同的后果:
- s3 上传失败意味着文件没有上传
- 但是 file.save() 失败意味着只有我们的 db 中的文件状态没有更新,但物理文件在 s3 系统中
这两个错误不能在同一个 try catch 块中处理,但是在 accept 方法中发生的事情也不清楚(关于幕后发生的事情)。最后,在回调-承诺桥中添加 try catch 块使代码和可读性变得复杂
那么在这种情况下最好的做法是什么
【问题讨论】:
-
"如果传递的接受方法抛出异常" - 它永远不会
标签: node.js promise async-await