gpt4 book ai didi

javascript - 回调解决未处理的promise,为什么?

转载 作者:行者123 更新时间:2023-12-01 02:27:39 24 4
gpt4 key购买 nike

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

return Promise.reject()

This is the code that i have for authenticating routes

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() 。 如果我尝试删除回调,它会在控制台中告诉我我有未处理的 promise 。这很奇怪,因为这段代码

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

工作得很好,并发送 try block 来直接捕获而不会给出未处理的 promise 错误。

The question

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

附注看来问题也能解决了

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

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

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

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

最佳答案

我认为问题在于,当您执行 return Promise.reject() 时,您希望代码转到 catch() block ,但是 return Promise.reject() 只是从函数返回一个被拒绝的 Promise。它不会进入你的 catch block 。相反,您可以像这样使用 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 的被拒绝的 promise ,或者它会捕获 throw,但它不会' t catch return Promise.reject() 因为你明确地返回了它。

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

关于javascript - 回调解决未处理的promise,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48610078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com