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()
?如果您要返回一个被拒绝的承诺,那么这些拒绝将需要处理。只需将其作为一个函数放在路由中,问题就不存在了。下面的答案给出了一个更具体的解释,我只是想知道我怎样才能在第二时间到达外线。谢谢你的解释,非常感谢,非常有趣。谢谢你的解释,非常感谢