繁体   English   中英

Node.js:未处理的承诺拒绝 - UnhandledPromiseRejectionWarning

[英]Node.js: Unhandled promise rejection - UnhandledPromiseRejectionWarning

我有一个 Node.js 应用程序。 这个应用程序有一个按钮来启动一个进程。 该过程中的步骤返回承诺。 我试图将这些承诺联系在一起。 出于某种原因,我收到了UnhandledPromiseRejectionWarning 但是,在我看来,我已经正确设置了它。 我的代码如下所示:

var myButton = document.getElementById('myButton');
if (myButton) {
  console.log('here');
  myButton.addEventListener('click', executeAction('0'));
}

function executeAction(input) {      
  let param1 = 'A';
  let promise = new Promise(function(resolve, reject) {
    try {
      executeStep1()
        .then(result => executeStep2(param1, result, input))
        .then(result => function(result) {
           console.log('All done');
           resolve(result);
        })
        .catch(err => reject(err))
      ;
    } catch (ex) {
      reject(ex);
    }
  });
  return promise;     
}

function executeStep1() {
  let promise = new Promise(function(resolve, reject) {        
    try {
      setTimeout(function() {
        resolve('[something]');
      }, 3000);
    } catch (ex) {
      reject();
    }
  });
  return promise;
}

function executeStep2(p1, p2, p3) {
  let promise = new Promise(function(resolve, reject) {        
    try {
      setTimeout(function() {
        console.log('step 2 has executed');
        resolve('awesome!')
      }, 3000);
    } catch (ex) {
      reject(ex);
    }  
  });
  return promise;
}

我已经确认executeStep2函数运行完成。 我的依据是我可以在控制台窗口中看到“步骤 2 已执行”。 然而,令我惊讶的是,我从未在控制台窗口中看到“全部完成”。 相反,我看到了上面提到的UnhandledPromiseRejectionWarning 关于这个结果,我不明白两件事:

  1. 为什么我在控制台中没有看到“全部完成”? executeStep2解决之后,该函数不应该被执行吗?
  2. 拒绝来自哪里? 我没有看到任何拒绝这一点的东西。

非常感谢您的帮助!

executeStep1()
    .then(result => executeStep2(param1, result, input))
    .then(result => { // no function(result) here
       console.log('All done');
       resolve(result);
    })
    .catch(err => reject(err))
  ;

当您调用使用 promise 的函数时会生成错误:

myButton.addEventListener('click', executeAction('0'));

您还需要在那里捕获拒绝。

myButton.addEventListener('click', executeAction('0')
    .catch((error) => console.log('ERROR', error));

拒绝被捕获在函数内部,但不在外部范围内,因为executeAction('0')返回一个承诺,或者它会但您将其用作非异步函数,因此它创建一个承诺,然后返回一个挂起承诺无需等待解决。 这看起来像是导致拒绝的原因,并且由于上述原因也没有处理。

这将修复它:

function executeAction(input) {      
  let param1 = 'A';
  return new Promise(function(resolve, reject) {
    try {
      executeStep1()
        .then(result => executeStep2(param1, result, input))
        .then(result => function(result) {
           console.log('All done');
           resolve(result);
        })
        .catch(err => reject(err))
      ;
    } catch (ex) {
      reject(ex);
    }
  });
}

您应该查看异步/等待。 它可以显着清理此代码。

 async function getSomething() { try { // throw 'Test error detected.' return 'test' } catch (e) { throw e } } async function testing() { try { const sample = await getSomething() return sample } catch (e) { throw e } } testing() .then((data) => console.log(data)) .catch((err) => console.log(err))

运行上面的示例,然后取消注释 throw。 使用这种模式以获得最大的胜利。 异常应该被抛出到函数被调用、显示、使用、呈现等的表面级别。函数应该简单地抛出错误。

这允许您使用错误处理中间件、高阶函数、侦听器、日志记录等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM