我现在正在学习Node.js,并练习使用EventEmitter和promises。
successfulOrder函数贯穿两个promises: verifyStockP和verifyCardP两个promises都非常简单。
我注意到,当我故意拒绝两个承诺中的一个时,程序会按预期工作。catch错误代码按预期运行。
如果我强制两个承诺都失败,我会得到以下错误消息:“(node:2316) UnhandledPromiseRejectionWarning: card invalid;”
如果verifyStockP和verifyCardP承诺都拒绝,我该如何使它不会出现此错误?
提前感谢大家!
如果你们对其他我应该修复的代码有什么建议,我将非常感谢!
const EventEmitter = require('events');
const emitter = new EventEmitter();
const successfulOrder = (prod) => {
return console.log(`Your ${prod} order has processed!`)
}
const failedOrder = (prod) => {
return console.log(`Your ${prod} order has failed to process.`)
}
emitter.on('order_successful', successfulOrder);
emitter.on('order_failed', failedOrder);
const submitOrder = (prod, prodQuantity, userCardDigits) => {
const currentStock = 10;
const verifyStockP = new Promise((resolve, reject) => {
if(prodQuantity <= currentStock) {
resolve('stock available')
}
else {
reject('out of stock')
}
})
const verifyCardP = new Promise((resolve,reject) => {
let cardDigits = 16;
if (cardDigits === userCardDigits) {
resolve('card valid')
}
else {
reject('card invalid')
}
})
verifyStockP
.then((resolvedVal) => {
console.log(resolvedVal);
return verifyCardP
}).then((resolvedVal) => {
console.log('card valid')
emitter.emit('order_successful', prod)
}).catch((error) => {
console.log(error)
// emitter.emit('order_failed', prod)
})
}
submitOrder('sunglasses', 15, 17)发布于 2021-06-05 11:56:35
问题是,如果第一个Promise被拒绝,那么第二个Promise就永远不会成为拥有catch的Promise链的一部分
两种可能的解决方案..。
处理此问题的一种方法是在第二个promise中单独添加一个“虚拟”catch
const p1 = new Promise((resolve, reject) => setTimeout(reject, 200, 'p1'));
const p2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'p2'));
p1
.then(r => p2)
.catch(e => console.log('error', e));
p2.catch(e => console.log('error2', e));
如果first promise在这里没有拒绝,你可以看到结果
const p1 = new Promise((resolve, reject) => setTimeout(resolve, 200, 'p1'));
const p2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'p2'));
p1
.then(r => p2)
.catch(e => console.log('error', e));
p2.catch(e => console.log('error2', e));
两个catch块都在运行
但是,如果第二个Promise完全不依赖于第一个Promise,并且在代码中您编写它的方式意味着两个Promise确实是并行运行的(尽可能多地运行,因为您的代码中没有异步)-使用Promise.all
const p1 = new Promise((resolve, reject) => setTimeout(reject, 100, 'p1'));
const p2 = new Promise((resolve, reject) => setTimeout(reject, 200, 'p2'));
Promise.all([p1, p2])
.then(([r1, r2]) => console.log(r1, r2))
.catch(e => console.log('error', e));
https://stackoverflow.com/questions/67845801
复制相似问题