- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
很容易忘记在异步函数中使用 try/catch,或者在使用 promises 时无法捕获所有可能的错误。这可能会导致无休止的“等待”,因为 Promise 永远不会被解决或拒绝。
如果存在 Uncaught Error ,是否有任何方法(例如通过代理或更改 promise 构造函数)导致异步函数或其他 promise 被拒绝?下面显示了一个一般情况。我正在寻找某种方法来克服“等待”(如抛出错误时应拒绝“p”)而不修复“badPromise”。
async function badPromise() {
const p = new Promise((res) => {
delayTimer = setTimeout(() => {
console.log('running timeout code...');
if (1 > 0) throw new Error('This is NOT caught!'); // prevents the promise from ever resolving, but may log an error message to the console
res();
}, 1000);
});
return p;
}
(async () => {
try {
console.log('start async');
await badPromise();
console.log('Made it to the end'); // never get here
} catch (e) {
console.error('Caught the problem...', e); // never get here
}
})();```
最佳答案
在未捕获的同步错误的情况下,Promises 已经拒绝:
If an error is thrown in the executor, the promise is rejected.
onFulfilled
and onRejected
functions ,例如 then
和 catch
If a handler function: [...] throws an error, the promise returned by
then
gets rejected with the thrown error as its value.
async
functions
Return Value: A
Promise
which will be resolved with the value returned by the async function, or rejected with an exception thrown from, or uncaught within, the async function.
你这里的问题不是 Promise 不处理 Uncaught Error ,它根本上是因为你的错误是异步的:就 Promise 而言,它的执行函数是一个成功的小函数,它调用 setTimeout
。当您的 setTimeout
处理程序运行并失败时,它会使用与 Promise 对象或其函数无关的自己的堆栈来执行此操作; badPromise
或 p
不存在于您的 setTimeout
处理程序中,除了处理程序通过闭包包含的 res
引用。在问题“Handle error from setTimeout”中,在 setTimeout
处理程序中捕获错误的技术都涉及编辑或包装处理程序,并且根据 HTML spec for timers步骤 9.2 没有机会捕获或插入调用传递到 setTimeout
的函数的错误情况。
除了编辑 badPromise
,几乎您无能为力。
备选方案:
依次修改/覆盖Promise构造器和setTimeout
方法,包装Promise构造器方法保存resolve
/reject
参数,然后包装全局 setTimeout
方法,以便使用 try
/catch
包装 setTimeout
处理程序调用新保存的 reject
参数。 由于更改这两个全局服务的脆弱性,我强烈建议不要使用此类解决方案。
创建一个包装高阶函数(即返回一个函数的函数),它接受拒绝回调并包装 setTimeout 调用。这在技术上是对 badPromise
的编辑,但它确实封装了正在发生的变化。它看起来像这样:
function rejectOnError(rej, func) {
return (...args) => {
try {
return func(...args);
} catch (e) {
rej(e);
}
};
}
async function badPromise() {
const p = new Promise((res, rej) => { // save reject
delayTimer = setTimeout(rejectOnError(rej, () => { // to use here
console.log('running timeout code...');
if (1 > 0) throw new Error('Now this is caught');
res();
}), 1000);
});
return p;
}
badPromise().catch(x => console.error(`outer: ${x}`));
console.log('bad promise initiated');
关于javascript - 如果有 Uncaught Error ,有什么方法可以使 promise 被拒绝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70856589/
你好我是 Angular JS 的初学者,当我开始创建模块和 Controller 时,我无法打印我的消息,下面是我的代码 var myModule = angular.module("myFirst
我对 JQuery 还是个新手,我正在尝试使用它遍历 JSON 数组并使用数组中的数据更新我的网页。 JSON 文件如下所示: [ { "firstname":"John",
我正在使用 AngularJS 1.3.5,我正在尝试从 json 文件中获取信息。这是我的代码:HTML 文件: {{da
我正在创建 Bootstrap 模板。我收到两个错误,我不知道自己做错了什么。当我搜索类似的问题时,似乎是脚本错乱了,但我认为它们的位置是正确的。 两个错误: 未捕获的 ReferenceError:
我试图用子菜单制作导航栏,但我一直收到 dropMenu 未定义,当我将鼠标悬停在两个巴黎链接上时,我收到 Uncaught TypeError: Cannot read property 'styl
我正在尝试在名为 UserComponent 的 Angular 组件上运行 karma 测试。在此组件中,我有一个 ngOnInit 执行此操作: ngOnInit() { const
当我启用 login.spec.ts 测试时,对于不同的测试,我总是随机收到此错误。未捕获错误:未捕获( promise ):错误:无法匹配任何路由。 URL 段:“注销” 我尝试使用以下方法伪造 a
自从我设置一个与 Angular 一起运行的网络应用程序以来已经有一段时间了。我正在通过一个旧项目回顾我的步骤(尝试在我正在做的页面上实现一个 Controller ,确保 Controller 文件
在 AWS Elastic Beanstalk 上部署应用程序后会发生此错误。构建和部署成功,所有模块都正常工作,除了一个显示上述 super 表达式错误的模块。一切似乎都在本地机器上正常工作,甚至可
我刚刚开始使用 Node.js 并尝试使用模块。我已经安装了 Node 和 npm,并确保一切顺利。我将在下面添加代码来向您展示我得到了什么。 我有两个 js 文件,它们在这里。 app.js: va
在 Android 4.4.2 KitKat (API 19) 模拟器上运行时,我的代码出现问题... 当我在 Android 4.3 (API 18) 模拟器上模拟我的项目时,它正常工作并使用 Ma
function more(){ var MoreDetails = document.getElementById('MoreDetails'); More
我正在练习 Javascript,并且有以下代码,该代码在 sets[i][j] = initial_sets [i ][j]; 行。这个想法似乎是正确的,但我不明白为什么会出现错误。 var set
$(document).ready(function(){ $('#name').val('Name1'); }); function clickMe(){ console.lo
我正在创建一个网络应用程序,但我遇到了一个无法解决的简单问题。我已将产生问题的代码放在这里:http://jsfiddle.net/rkumarnirmal/5w3FG/ 应该显示此答案的第二个ale
我正在执行一项长时间运行的任务,在中间的某个位置,可能会抛出此异常: Uncaught DOMException: Blocked a frame with origin "http://localh
我试图通过使用 HTML5 中的 onEnded 属性一首接一首地播放 3 首歌曲。这是我的第一次尝试,但出现错误。 错误: Uncaught ReferenceError: src is not d
检查 Fiddle 以查看发生的故障。 当我将数据(即使我将其留空)添加到文本框并尝试单击“添加”时,它没有执行任何操作。 打开 Chrome 和 Firefox 控制台都给我同样的错误,它说“cha
这个问题在这里已经有了答案: How to access the correct `this` inside a callback (13 个回答) 关闭5年前。 您好,这是我的(快捷方式)示例代码:
我正在处理一个项目,每次 Node 运行我的代码时,浏览器控制台都会给我这个: Uncaught TypeError: Failed to resolve module specifier "expr
我是一名优秀的程序员,十分优秀!