尝试catch块没有捕获嵌套回调

时间:2016-10-21 14:05:20

标签: javascript

我试图了解如何在嵌套回调中使用try / catch。为什么这段代码没有抓住我的新错误?

function test(cb) {
  setTimeout(function() {
    throw new Error("timeout Error");
  }, 2000);
}

try {
  test(function(e) {
    console.log(e);
  });
} catch (e) {
  console.log(e);
}

2 个答案:

答案 0 :(得分:8)

当传递给setTimeout的函数运行时,错误以异步方式发生。抛出错误时,test函数已经完成执行。

答案 1 :(得分:1)

有许多方法可以为Javascript执行设置计时器。这是使用Promise.race()的一种方式:

(async () => {
  try {
    await Promise.race([

      // Timer.
      new Promise((res, rej) => {
        setTimeout(() => {
          rej("Timeout error!");
        }, 2000);
      }),

      // Code being timed.
      new Promise((res, rej) => {
        // Do some stuff here.
        // If it takes longer than 2 seconds it will fail.
        res("Finished in under 2 seconds.");
      })

    ]);
  } catch (err) {
    console.log("we got an err: " + err);
  }
})();