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

Javascript Node.js:未处理的承诺拒绝-未处理的PromisejectionWarning,javascript,node.js,promise,Javascript,Node.js,Promise,我有一个Node.js应用程序。此应用程序有一个启动进程的按钮。这一过程中的步骤回报了承诺。我正试图把这些承诺连在一起。由于某种原因,我收到了一个未处理的PromisejectionWarning。然而,在我看来,我已经正确地设置了这个。我的代码如下所示: var myButton = document.getElementById('myButton'); if (myButton) { console.log('here'); myButton.addEventListener('c

我有一个Node.js应用程序。此应用程序有一个启动进程的按钮。这一过程中的步骤回报了承诺。我正试图把这些承诺连在一起。由于某种原因,我收到了一个
未处理的PromisejectionWarning
。然而,在我看来,我已经正确地设置了这个。我的代码如下所示:

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已执行”。然而,令我惊讶的是,我从未在控制台窗口中看到“全部完成”。相反,我看到上面提到的
未处理PromisejectionWarning
。关于这个结果,我不明白两件事:

  • 为什么我看不到控制台中的“全部完成”?该函数不应该在
    executeStep2
    解析后执行吗
  • 拒绝来自哪里?我看不出有什么东西拒绝这个

  • 非常感谢你的帮助

    调用使用承诺的函数时会生成错误:

    executeStep1()
        .then(result => executeStep2(param1, result, input))
        .then(result => { // no function(result) here
           console.log('All done');
           resolve(result);
        })
        .catch(err => reject(err))
      ;
    
    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/await。它可以显著地清除此代码

    异步函数getSomething(){ 试一试{ //抛出“检测到测试错误” 返回“测试” } 捕获(e){ 掷e } } 异步函数测试(){ 试一试{ const sample=wait getSomething() 回样 }捕获(e){ 掷e } } 测试() .然后((数据)=>console.log(数据))
    .catch((err)=>console.log(err))Remove
    function(result)
    在第二个
    中,然后
    。您已经在那里使用箭头函数语法来声明函数。无论如何,请避免使用箭头函数语法!顺便说一句,在
    newpromise
    回调中,您永远不需要
    try{…}catch(err){reject(err)}
    ,构造函数会自动执行该操作。在
    executeStep2
    中的
    '[something]
    究竟是什么意思,这实际上是一个可能引发异常的表达式吗?请分享您的真实代码好吗<代码>按钮。addEventListener('click',executeAction('0')
    result=>函数(result){
    看起来都是错误的如果这是节点,为什么要访问
    文档
    ?这更接近了。当我运行它时,它不再挂起。但是,我仍然收到
    未处理PromisejectionWarning
    错误。