承诺链接未处理的承诺

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));