首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Promise链接未处理的promise

Promise链接未处理的promise
EN

Stack Overflow用户
提问于 2021-06-05 10:40:48
回答 1查看 32关注 0票数 0

我现在正在学习Node.js,并练习使用EventEmitter和promises。

successfulOrder函数贯穿两个promises: verifyStockP和verifyCardP两个promises都非常简单。

我注意到,当我故意拒绝两个承诺中的一个时,程序会按预期工作。catch错误代码按预期运行。

如果我强制两个承诺都失败,我会得到以下错误消息:“(node:2316) UnhandledPromiseRejectionWarning: card invalid;”

如果verifyStockP和verifyCardP承诺都拒绝,我该如何使它不会出现此错误?

提前感谢大家!

如果你们对其他我应该修复的代码有什么建议,我将非常感谢!

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-05 11:56:35

问题是,如果第一个Promise被拒绝,那么第二个Promise就永远不会成为拥有catch的Promise链的一部分

两种可能的解决方案..。

处理此问题的一种方法是在第二个promise中单独添加一个“虚拟”catch

代码语言:javascript
复制
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在这里没有拒绝,你可以看到结果

代码语言:javascript
复制
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

代码语言:javascript
复制
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));

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67845801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档