如何从异步代码中捕获错误

时间:2018-10-18 06:57:40

标签: javascript asynchronous

下面的代码行能够捕获错误(因为它是同步的)

 new Promise(function(resolve, reject) {
        throw new Error("Whoops!");
    }).catch(alert);

但是当我如下修改代码时

 new Promise(function(resolve, reject) {
      setTimeout(() => {
        throw new Error("Whoops!");
      }, 1000);
    }).catch(alert);

它无法捕获错误。 我有一个要捕获此错误的用例。我该如何实现?

通过链接“ https://bytearcher.com/articles/why-asynchronous-exceptions-are-uncatchable/”,我能够理解为什么会这样。只是想知道仍然有解决此错误的解决方案。

请注意,通过使用setTimeout,我指出了异步调用的使用,它可以给出一些响应,也可以提供错误,就像我在fetch语句中提供错误的URL一样。

fetch('api.github.com/users1')   //'api.github.com/user'is correct url
.then(res => res.json())
.then(data => console.log(data))
.catch(alert);

4 个答案:

答案 0 :(得分:2)

您将需要try内的catch / setTimeout 您要让new Promise(function(resolve, reject) { setTimeout(() => { try { throw new Error("Whoops!"); // Some operation that may throw } catch (e) { reject(e); } }, 1000); }).catch(alert); 调用的函数:

setTimeout

函数throw new Error("Whoops!")的调用完全独立于promise executor函数的执行上下文。

在上文中,我假设throw是可能引发错误的操作的替代品,而不是实际的throw语句。但是,如果您实际上是在进行reject,则可以直接致电new Promise(function(resolve, reject) { setTimeout(() => { reject(new Error("Whoops!")); }, 1000); }).catch(alert);

SELECT col1, col2, REPEAT(col1, col2)
FROM   table1

答案 1 :(得分:2)

使用拒绝抛出错误,

manage_stock

答案 2 :(得分:0)

要处理错误,请将try-catch放在setTimeout处理程序内:

 new Promise(function(resolve, reject) {
      setTimeout(() => {
          try{
                  throw new Error("Whoops!");
          }catch(alert){
                  console.log(alert);
          }
       }, 1000);
 });

答案 3 :(得分:0)

您还可以使用一个小实用程序:

function timeout(delay){ 
  return new Promise(resolve => setTimeout(resolve, delay)); 
}

timeout(1000)
  .then(() => {
     throw new Error("Whoops!");
  })
  .catch(alert);