我有一个Node.js应用程序。这个应用程序有一个按钮,启动一个进程。该过程中的步骤将返回承诺。我试图将这些承诺链接在一起。出于某种原因,我收到了UnhandledPromiseRejectionWarning
。但是,在我看来,我已经正确设置了这一点。我的代码如下所示:Node.js:未处理的承诺拒绝 - 未处理的拒绝拒绝警告
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
。我不明白这个结果的两点:
- 为什么我在控制台中看不到“全部完成”?
executeStep2
解决后不应该执行该功能吗? - 拒收来自哪里?我没有看到任何拒绝这个的东西。
非常感谢您的帮助!从当你调用使用承诺的功能(S)产生
删除'函数(结果)'中第二个'then'。您已经在那里使用箭头函数语法来声明该函数。 –
无论如何避免['Promise' constructor antipattern](https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)!顺便说一句,你从来不需要'在新的Promise'回调中尝试{...} catch(err){reject(err)}',构造函数会自动执行该操作。 – Bergi
你的'executeStep2'中的'[something]'究竟是一个实际上可能抛出异常的表达式? – Bergi