【问题标题】:Callback to solve unhandled promise, why?回调解决未处理的承诺,为什么?
【发布时间】:2018-07-14 13:43:26
【问题描述】:

我已经解决了这个问题,所以我的问题更多是理论上的,因为我试图了解幕后发生的事情以及为什么我需要在

上进行回调
return Promise.reject()

这是我用来验证路由的代码

async customAuth(req, res, next) {
    let token = req.header('x-auth');
    try{
        const userByToken = await User.findByToken(token)

        const userByCreator = await User.findOne({_id: req.body.creator})

        if (!userByToken || !userByCreator) {
            return Promise.reject()
        }            

        else if(userByToken.tokens[0].token !== userByCreator.tokens[0].token){
            console.log('its here')
            return Promise.reject().catch((err)=>{
                res.status(401).send('why do i need this callback?')
            })    
        }              
        next()

    }catch(err){res.status(401).send("something happened")}
}

正如您在比较 userByToken 和 userByCreator 时看到的那样,我正在尝试使用回调调用 return Promise.reject()。 如果我尝试删除回调,它会在控制台中告诉我我有未处理的承诺。这很奇怪,因为这段代码

 if (!userByToken || !userByCreator) {
                return Promise.reject()
            }            

工作得很好,并发送 try 块直接捕获而不给出未处理的承诺错误。

问题

为什么我必须进行回调?就像理论上一样,为什么如果我删除回调它会告诉我它未处理的承诺?

附言 看来问题也可以解决

const rejected = await customAuth(Promise.reject('promise was rejected'));
return rejected

但是为什么这段代码可以工作,

 if (!userByToken || !userByCreator) {
            return Promise.reject()
      }

但是当我尝试放入比较 IF 块时,它说未处理?

【问题讨论】:

  • 我不明白你说“我为什么要进行回调”或“Promise.reject() 带有回调”是什么意思?
  • 您是否意识到return Promise.reject() 不会导致它转到此函数中的catch 块?这只是从这个函数返回一个被拒绝的承诺。现在,如果您选择了throw new Error("some error"),那将转到您的catch 块。
  • 我的意思是为什么当我说 if(!userByToken){return Promise.reject()} 效果很好但是如果我在比较它认为的令牌时尝试将相同的 return Promise.reject 放在 IF 块内为“不好,需要回调
  • 你能告诉我们customAuth()是如何被调用的吗?如果你要返回一个被拒绝的承诺,那么这就是需要处理这些拒绝的地方。
  • 只是把它作为一个函数放在路由中,问题肯定不存在。下面的答案给出了一个更具体的解释,我只是想知道我怎样才能通过第二次拒绝达到外部捕获

标签: javascript jquery angularjs node.js callback


【解决方案1】:

我认为问题在于,当您执行return Promise.reject() 时,您希望您的代码进入您的catch() 块,但return Promise.reject() 只是从函数返回一个被拒绝的承诺。它不会进入你的 catch 块。相反,您可以像这样使用throw

async customAuth(req, res, next) {
    let token = req.header('x-auth');
    try {
        const userByToken = await User.findByToken(token)

        const userByCreator = await User.findOne({_id: req.body.creator})

        if (!userByToken || !userByCreator) {
            throw new Error("missing userByToken or userByCreator");
        }            

        else if(userByToken.tokens[0].token !== userByCreator.tokens[0].token){
            console.log('its here')
            throw new Error("user token doesn't match creator token");
        }              
        next()

    } catch(err) {
        console.log(err);
        res.status(401).send("something happened");
    }
}

您可能感到困惑的是,您的 try/catch 会捕获您正在使用 await 的被拒绝承诺,或者它会捕获 throw,但它不会捕获 return Promise.reject(),因为您明确返回那个。

因此,当您执行return Promise.reject() 并因此返回一个被拒绝的承诺并且调用者没有.catch() 时,您会得到一个未处理的被拒绝承诺。

【讨论】:

  • 嗯很有趣。谢谢你的解释,非常感谢
【解决方案2】:

对不起,我错了

Promise.reject()

try / catch 抓不到,
它只能被 somePromise.cateh(() => {}),

如果你想在外层捕获它,
只要throw new Error()就可以了, 不需要return or promise.reject

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2021-09-27
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多