首页 文章

如何处理catch块然后是Promise [复制]

提问于
浏览
3

这个问题在这里已有答案:

我有以下代码

function request(status){
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if(status){
        resolve('Success');
      } else {
        reject('error');
      }
    }, 1000);
  }); 
}


let promise = request(false);

promise.then( response => {
  console.log('response' , response);
});

promise.catch( (err) => {
  console.log('got Error', err);
});

即使我发现拒绝回复,也会抛出跟随错误

得到错误错误(节点:11252)UnhandledPromiseRejectionWarning:错误(节点:11252)UnhandledPromiseRejectionWarning:未处理的承诺拒绝 . 此错误源于通过抛出异步函数而没有catch块,或者拒绝未使用.catch()处理的promise . (拒绝ID:1)(节点:11252)[DEP0018]弃用警告:不推荐使用未处理的拒绝承诺 . 将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程 .

但如果我删除 then 块然后它工作正常, NO STACK TRACE ERROR ON THE CONSOLE

function request(status){
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if(status){
        resolve('Success');
      } else {
        reject('error');
      }
    }, 1000);
  }); 
}


let promise = request(false);

promise.catch( (err) => {
  console.log('got Error', err);
});

输出:

得到错误错误

我不明白为什么它以这种方式运作?

3 回答

  • 5

    这里的关键 - 以及使用承诺的关键之一 - 是 then and catch create new promises . 因此,未被处理的被拒绝的承诺是由 then 创建的:

    let promise = request(false);
    
    promise.then( response => {          // Creates new promise, rejection isn't handled
      console.log('response' , response);
    });
    
    promise.catch( (err) => {            // Creates new promise
      console.log('got Error', err);
    });
    

    这是您看到承诺链的原因之一:

    request(false)
    .then( response => {
      console.log('response' , response);
    })
    .catch( (err) => {
      console.log('got Error', err);
    });
    

    目前,三项承诺仍在创建(原从 request ,一个从 then ,并从 catch 的一个),但拒绝是由于最终 catch 处理程序,他们三个人都处理 .

    thencatch 创建的承诺如下:

    • 如果基础承诺解决:

    • 如果没有 then 处理程序,请使用原始承诺的解决方案解析

    • 如果有 then 处理程序,请将其命名为:

    • 如果处理程序返回一个thenable(一个类似promise的对象),请挂钩并根据是否可解析或拒绝来解析或拒绝

    • 如果处理程序返回不可用的值,请使用该值解析

    • 如果处理程序抛出错误,请拒绝该错误

    • 如果潜在的承诺拒绝:

    • 如果没有 catch 处理程序,请拒绝原始承诺的拒绝

    • 如果有一个 catch 处理程序,请调用它并完全按照上面的 then 处理程序执行(根据返回或抛出的内容解析或拒绝)

  • 2

    请看看以下两种可以处理的方法 .

    在第一种方法中,一旦承诺在'then'内解决,你就会尝试处理承诺拒绝,否则你可以用.catch()链接.then() .

    另请注意,只有在拒绝承诺时才会调用 then 中的错误块 . 但是即使存在任何其他js错误,也会调用catch块 .

    promise
      .then(response => {
        console.log("response", response);
      })
      .catch(err => {
        console.log(err);
      });
    
    promise.then(
      response => {
        console.log("response", response);
      },
      err => {
        console.log(err);
      }
    );
    

    Code Sandbox Link

  • 1

    promise.then() 创建一个新的承诺,其结算取决于 promise . 当 promise 被拒绝时, promise.then() 创建的隐式承诺也被拒绝,并且没有 catch() 子句来处理错误 .

    您需要做的是将 .catch() 链接到 promise.then() 返回的承诺:

    function request(status){
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          if(status){
            resolve('Success');
          } else {
            reject('error');
          }
        }, 1000);
      }); 
    }
    
    
    let promise = request(false);
    
    promise.then( response => {
      console.log('response' , response);
    }).catch( (err) => {
      console.log('got Error', err);
    });
    

相关问题