gpt4 book ai didi

javascript - 未捕获( promise )错误

转载 作者:行者123 更新时间:2023-12-04 00:56:36 25 4
gpt4 key购买 nike

这显然是一个SSCCE。我有以下(jsFiddle here):

<html>
<body>
<input id='file-dlg' type='file'/>
<br/>
<button id='submit' type='button'>submit</button>
<script>
document.getElementById('file-dlg').addEventListener('change', storeAPromise);
var p;
function storeAPromise() {
p = new Promise(function executor(resolve, reject) {
try {
throw new Error('snafu');
} catch(e) {
reject(e);
}
});
};
document.getElementById('submit').onclick = function() {
p.then(function() {}, function reject(e) {
console.error('some problem happenned', e);
});
};
</script>
</body>
</html>

当用户使用文件对话框选择文件时,我希望控制台上不会打印任何内容,因为 Error被抓到并且 promise 的 reject函数被调用。相反,我希望只有当我单击“提交”按钮时,错误才会出现在控制台上,并带有“发生某些错误”的描述。

然而,这不是我观察到的。一旦用户使用我在控制台上看到的对话框选择一个文件:
Uncaught (in promise) Error: snafu(…)

当用户按下“提交”按钮时,我确实看到了预期的日志行“发生了一些问题”,但我不明白为什么当用户选择带有文件对话框。我也不明白为什么将错误描述为“未捕获”,因为我捕获(无条件)所有异常并简单地调用 reject功能。

最佳答案

这不是未捕获的异常(exception),而是未捕获的拒绝。 Promise 不应该在没有附加错误回调的情况下处于被拒绝状态——这就是控制台警告你的原因。您还可以使用 unhandledrejection event 在您的应用程序中处理这些情况。 .

如果您想稍后处理错误(当用户单击按钮时安装处理程序,这可能永远不会!),您仍然需要立即安装一个空回调(显式忽略错误)以抑制警告。

var p = Promise.resolve();
document.getElementById('file-dlg').addEventListener('change', function createPromise() {
p = new Promise(function executor(resolve, reject) {
throw new Error('snafu');
});
p.catch(e => {/* ignore for now */});
});
document.getElementById('submit').addEventListener('click', function addErrorHandler() {
p.catch(function onReject(e) {
console.error('some problem happened', e);
});
});

请注意,您不需要 try/ catch - 默认情况下,promise 构造函数将捕获来自执行程序的所有异常。

关于javascript - 未捕获( promise )错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50474287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com