下面的代码实际上应该捕获异步函数抛出的错误,但是,它显示了 then 块的已解决。
ok
None
答案 0 :(得分:3)
因为你没有回报承诺。
<div class="main-container"> <!-- main-container -->
<header class="header"> <!-- header -->
<div class="logo"> <!-- logo -->
<a href="index.html">
<p>LOGO HERE</p>
</a>
</div> <!-- /logo -->
<div class = "navbar"> <!-- navbar -->
<ul class="nav-links">
<li class="nav-item">Menu Item 1</li>
<li class="nav-item">Menu Item 2</li>
<li class="nav-item">Menu Item 3</li>
<li class="nav-item">Menu Item 4</li>
<li class="nav-item">Menu Item 5</li>
</ul>
</div> <!-- /navbar -->
</header> <!-- /header -->
</div> <!-- /main-container -->
答案 1 :(得分:3)
我认为这里更直接的方法是坚持承诺。
function test(num) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (num == 11) {
reject(new Error('Rejected!'));
} else {
resolve(num);
}
}, 1000);
});
}
如果您设置为 async/await,一种可能的方法可能如下,如 this post 中所建议。
function timeout(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function test(num) {
await timeout(1000);
if (num == 11) {
throw new Error('Rejected!');
} else {
return num;
}
}
答案 2 :(得分:1)
这是因为 setTimeout 是同步函数。 是的,setTimeout 添加了一些异步执行的代码,但是 setTimeout 本身是在主线程上执行的(同步)。
因此,您的
async() =>
setTimeout(() => {
if (num == 11) {
throw 'err';
}
}, 1000))()
立即(同步)完成,完成后,您的“then”被触发,仅在一秒后,抛出错误