代码之家  ›  专栏  ›  技术社区  ›  Thamaraiselvam

如何处理捕获块,然后是承诺[副本]

  •  3
  • Thamaraiselvam  · 技术社区  · 7 年前

    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);
    });
    

    即使我捕捉到拒绝响应,也会抛出以下错误

    出现错误(node:11252)未处理的PromisejectionWarning:错误 (node:11252)未处理的PromisejectionWarning:未处理的承诺 拒绝。此错误源于 没有catch块的函数,或者拒绝 未使用.catch()处理(拒绝id:1)(node: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);
    });
    

    输出:

    出现错误

    3 回复  |  直到 7 年前
        1
  •  7
  •   T.J. Crowder    7 年前

    这里最关键的一点,也是使用承诺最关键的一点,就是 then catch 创造新的承诺 . 所以被拒绝的承诺,没有被处理的,是由 :

    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 ,来自 抓住 ),由他们三个处理,但最终拒绝 抓住 处理程序。

    创造的承诺 然后 抓住

    • 如果基本承诺解决:
      • 如果没有 汉德勒,按照原来的承诺来解决
      • 如果有 然后
        • 如果处理程序返回
        • 如果处理程序返回非-
      • 如果没有 抓住 处理人,拒绝与拒绝从原来的承诺
      • 抓住 汉德勒,打电话给他,然后照他说的做 上面的处理程序(根据返回或抛出的内容解析或拒绝)
        2
  •  2
  •   Patrick Roberts Benjamin Gruenbaum    7 年前

    promise.then() promise . 什么时候? 承诺 答应。然后() 也被拒绝并且没有 catch() 子句来处理错误。

    你需要做的是锁链 .catch() 答应。然后() :

    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);
    });
        3
  •  1
  •   Shubham Gupta    7 年前

    请看下面两种处理方法。

    在第一种方法中,一旦在“then”中解析了承诺,您就可以尝试处理承诺拒绝,或者您可以将.then()与.catch()链接起来。

    另外请注意,err块在 只有在承诺被拒绝的情况下才会被调用。但是,即使存在任何其他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