承诺链接未处理的承诺
Promise chaining unhandled promise
我现在正在学习 Node.js 并练习使用 EventEmitter 和 promises。
successfulOrder 函数贯穿两个承诺:verifyStockP 和 verifyCardP
两个承诺都超级简单。
我注意到,当我故意拒绝两个 promise 之一时,程序会按预期运行。捕获错误代码按预期运行。
如果我强制两个承诺都失败,我会收到以下错误消息:
'(节点:2316)UnhandledPromiseRejectionWarning:卡无效;'
如果 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)
问题是,如果第一个 Promise 被拒绝,第二个 Promise 永远不会成为具有 catch
的 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没有reject的话可以在这里看到结果
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));
我现在正在学习 Node.js 并练习使用 EventEmitter 和 promises。
successfulOrder 函数贯穿两个承诺:verifyStockP 和 verifyCardP 两个承诺都超级简单。
我注意到,当我故意拒绝两个 promise 之一时,程序会按预期运行。捕获错误代码按预期运行。
如果我强制两个承诺都失败,我会收到以下错误消息: '(节点:2316)UnhandledPromiseRejectionWarning:卡无效;'
如果 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)
问题是,如果第一个 Promise 被拒绝,第二个 Promise 永远不会成为具有 catch
两种可能的解决方案...
处理这个问题的一种方法是在第二个承诺中单独添加一个“虚拟”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没有reject的话可以在这里看到结果
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));