回调解决未处理的承诺,为什么?

时间:2018-02-04 16:02:54

标签: javascript jquery angularjs node.js callback

我已经解决了这个问题,所以我的问题更多是一个理论问题,因为我试图了解幕后发生了什么,为什么我需要回调

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时,我正试图通过回调调用返回Promise.reject()。 如果我尝试删除回调,它会在控制台中告诉我我有未处理的承诺。因为这段代码

,所以我们只是蠢
 if (!userByToken || !userByCreator) {
                return Promise.reject()
            }            

完全正常,并发送try块直接捕获,而不会给出未经许可的承诺错误。

  

问题

为什么我要回电?就像在理论上一样,为什么如果我删除回调它会告诉我它未经处理的承诺?

P.S 好像问题也可以解决

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

但仍然为什么这段代码会起作用,

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

但是当我试图进行比较IF阻止它说未处理?

2 个答案:

答案 0 :(得分:2)

我认为问题在于,当您执行return Promise.reject()时,您希望代码转到catch()块,但return Promise.reject()只会从函数返回被拒绝的承诺。它没有进入你的捕获块。相反,您可以像这样使用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,但它不会捕获{{ 1}}因为你明确地返回了它。

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

答案 1 :(得分:0)

抱歉,我错了

Promise.reject()

无法抓住try / catch
它只能被捕获 somePromise.cateh(() => {})

如果你想在外部捕获中捕获它,
只是throw new Error()没问题, 不需要return or promise.reject

相关问题