【发布时间】:2021-05-31 00:35:05
【问题描述】:
我有一个用于向 IndexDb 数据库添加记录的函数:
async function addAsync(storeName, object) {
return new Promise((res, rej) => {
// openDatabaseAsync() is another reusable method to open the db. That works fine.
openDatabaseAsync().then(db => {
var store = openObjectStore(db, storeName, 'readwrite');
var addResult = store.add(JSON.parse(object));
addResult.onsuccess = res;
addResult.onerror = (e) => {
console.log("addResult Error");
throw e;
};
}).catch(e => {
// Error from "throw e;" above NOT GETTING CAUGHT HERE!
console.error("addAsync ERROR > ", e, storeName, object);
rej(e);
});
})
}
如果我尝试添加重复键,那么我期望:
addResult.onerror = (e) => {
console.log("addResult Error");
throw e;
}
捕捉它。确实如此。
但是,我也期待我的
.catch(e => {
// Error from "throw e;" above NOT GETTING CAUGHT HERE!
console.error("addAsync ERROR > ", e, storeName, object);
rej(e);
})
捕获该错误。但相反,我得到了一个“未捕获”的日志。
控制台输出:
addResult Error
Uncaught Event {isTrusted: true, type: "error", target: IDBRequest, currentTarget: IDBRequest, eventPhase: 2, …}
最后的 .catch 是否只处理来自 openDatabaseAsync 调用的异常?我现在会想到,因为它被链接到 .then.
总之,我对上述代码的期望如下:
- 如果 openDatabaseAsync() 失败,那么我没有发现它,因此错误将被发送给 addAsync() 的调用者。
- 如果 .then 失败,那么我希望 .catch 能够捕获它,记录错误,然后拒绝承诺,这意味着调用 addAsync() 需要处理。
但是,我认为我应该从该行获取日志:
console.error("addAsync ERROR > ", e, storeName, object);
在拒绝被发送回 addAsync() 的调用者之前,此时可能未处理。
【问题讨论】:
-
没有被捕获的东西是
addAsync().catch()的东西,因为你拒绝了从addAsync()返回的承诺。你知道那个电话的结果吗? -
谢谢@TKoL。您的问题的答案是“否”。它由 Blazor JSInterop 调用,但我可以继续使用它。但是,就您而言,我没有得到日志
"addAsync ERROR > ...",所以这告诉我throw e;没有被.catch捕获,这就是我目前感到困惑的地方。随后我可以从addAsync()的调用者继续进行外部处理。
标签: javascript promise