【发布时间】:2017-10-18 02:31:17
【问题描述】:
我有一个 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。这个结果有两点我不明白:
- 为什么我在控制台中看不到“全部完成”?不应该在
executeStep2解决后执行该函数吗? - 拒绝来自哪里?我没有看到任何拒绝这个的东西。
非常感谢您的帮助!
【问题讨论】:
-
删除第二个
function(result)中的then。您已经在那里使用箭头函数语法来声明函数。 -
无论如何都要避免使用
Promiseconstructor antipattern!顺便说一句,new Promise回调中永远不需要try { … } catch(err) { reject(err) },构造函数会自动执行此操作。 -
您的
executeStep2中的'[something]'到底是什么,这实际上是一个可能引发异常的表达式吗? -
你能分享你的真实代码吗?
Button.addEventListener('click', executeAction('0'));和result => function(result) {看起来都像错误 -
如果这是节点,你为什么访问
document?
标签: javascript node.js promise