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

Javascript 回调以解决未处理的承诺,为什么?,javascript,jquery,angularjs,node.js,callback,Javascript,Jquery,Angularjs,Node.js,Callback,我已经解决了这个问题,所以我的问题更多的是一个理论性的问题,因为我试图理解引擎盖下发生了什么,为什么我需要对它进行回调 return Promise.reject() 这是我用来验证路由的代码 正如您所看到的,当我比较userByToken和userByCreator时,我试图用callback调用return Promise.reject()如果我尝试删除回调,它会在控制台中告诉我,我有未处理的承诺。这很奇怪,因为这个代码 if (!userByToken || !userByCreato

我已经解决了这个问题,所以我的问题更多的是一个理论性的问题,因为我试图理解引擎盖下发生了什么,为什么我需要对它进行回调

return Promise.reject()
这是我用来验证路由的代码

正如您所看到的,当我比较userByToken和userByCreator时,我试图用callback调用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()
      }

但是,当我试着在比较中,如果块,它说未处理

我认为问题在于,当您执行
返回承诺.拒绝()
时,您希望您的代码转到
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将捕获一个被拒绝的承诺,您正在使用
wait
打开它,或者它将捕获一个
throw
,但它不会捕获
return promise.reject()
,因为您正在显式返回它


因此,当您执行
return Promise.reject()
并因此返回一个被拒绝的承诺,而调用方没有
catch()
,那么您将得到一个未处理的被拒绝承诺。

我认为问题在于,当您执行
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将捕获一个被拒绝的承诺,您正在使用
wait
打开它,或者它将捕获一个
throw
,但它不会捕获
return promise.reject()
,因为您正在显式返回它

因此,当您执行
返回承诺。拒绝()
并因此返回被拒绝的承诺,而调用方没有
.catch()
,那么您将得到一个未处理的被拒绝承诺。

对不起,我错了

Promise.reject()
无法被
try/catch

它只能被人抓住
somePromise.cateh(()=>{})
,

如果您想在外部捕捉到它,
只需抛出新错误()即可 不需要退货或承诺。拒绝。对不起,我错了

Promise.reject()
无法被
try/catch

它只能被人抓住
somePromise.cateh(()=>{})
,

如果您想在外部捕捉到它,
只需抛出新错误()即可
不需要返回或承诺。拒绝

我不明白你说的“为什么我必须进行回调”或“promise.reject()with callback”是什么意思?你是否意识到
return promise.reject()
不会导致它转到这个函数中的
catch
块?它只是从这个函数返回一个被拒绝的承诺。现在,如果您确实抛出了新的错误(“某些错误”),这将转到您的
catch
块。我的意思是为什么当我说if(!userByToken){return Promise.reject()}工作正常,但如果我尝试在比较令牌时将相同的return Promise.reject放在if块内部,那么它就被视为“不太好,需要回拨。您能告诉我们如何调用
customAuth()
?如果您要返回一个被拒绝的承诺,那么这些拒绝将需要处理。只需将其作为一个函数放在路由中,问题就不存在了。下面的答案给出了一个更具体的解释,我只是想知道我怎样才能抓住第二个拒绝我不明白你说的“为什么我必须进行回调”或“Promise.reject()with callback”是什么意思?你知道
return Promise.reject()吗
是否会导致它转到此函数中的
catch
块?它只是从这个函数返回一个被拒绝的承诺。现在,如果您确实抛出了新的错误(“某些错误”),这将转到您的
catch
块。我的意思是为什么当我说if(!userByToken){return Promise.reject()}工作正常,但如果我尝试在比较令牌时将相同的return Promise.reject放在if块内部,那么它就被视为“不太好,需要回拨。您能告诉我们如何调用
customAuth()
?如果您要返回一个被拒绝的承诺,那么这些拒绝将需要处理。只需将其作为一个函数放在路由中,问题就不存在了。下面的答案给出了一个更具体的解释,我只是想知道我怎样才能在第二时间到达外线。谢谢你的解释,非常感谢,非常有趣。谢谢你的解释,非常感谢