Javascript Node.js:未处理的承诺拒绝-未处理的PromisejectionWarning
我有一个Node.js应用程序。此应用程序有一个启动进程的按钮。这一过程中的步骤回报了承诺。我正试图把这些承诺连在一起。由于某种原因,我收到了一个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
未处理的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
错误。