如何处理catch块然后是Promise

Tha*_*vam 3 javascript node.js es6-promise

我有以下代码

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);
});
Run Code Online (Sandbox Code Playgroud)

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

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

但是如果我移除then块然后它工作正常, 没有堆栈控制台上的跟踪错误

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);
});
Run Code Online (Sandbox Code Playgroud)

输出:

得到错误错误

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

T.J*_*der 5

这里的关键-和有关使用承诺的关键的东西-就是thencatch创造新的承诺.因此,被拒绝的未被处理的承诺是由以下人员创建的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);
});
Run Code Online (Sandbox Code Playgroud)

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

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

在那里,仍然创建了三个promises(原始的request,一个来自then,一个来自catch),但是最终catch处理程序对所有三个都处理了拒绝.

由此创建then和承诺的承诺catch:

  • 如果潜在的承诺解决:
    • 如果没有then处理程序,请使用原始承诺的解决方案解决
    • 如果有then处理程序,请调用它:
      • 如果处理程序返回一个thenable(一个类似promise的对象),请挂钩并根据是否可以解析或拒绝来解析或拒绝
      • 如果处理程序返回不可用的值,请使用该值解析
      • 如果处理程序抛出错误,请拒绝该错误
  • 如果潜在的承诺拒绝:
    • 如果没有catch处理程序,请拒绝原始承诺的拒绝
    • 如果有一个catch处理程序,请调用它并完全按照then上面的处理程序执行(根据返回或抛出的内容解析或拒绝)