Promise 没有捕获异步函数抛出的错误

时间:2021-02-28 09:58:07

标签: javascript node.js

下面的代码实际上应该捕获异步函数抛出的错误,但是,它显示了 then 块的已解决。

ok
None

3 个答案:

答案 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”被触发,仅在一秒后,抛​​出错误