我已将异步函数与回调相结合,因为我需要异步函数来等待另一个异步函数。回调抛出了我需要捕获的错误。如何捕获异步函数调用的回调中抛出的错误?只要someFunction是异步的
,下面代码中的try-catch块就不起作用let someAsyncFunction = async () => {
return true
}
let someFunction = async (callback)=> {
await someAsyncFunction()
callback()
}
try {
someFunction(()=> {
throw ("Some error")
console.log("Callback has been called")
});
} catch (error) {
console.log(error)
}
这是实际的代码。抛出错误,第一个函数运行良好。我试图让第二个功能做同样的事情。
async facebook(req, res, next) {
throw ({status:405, message:"Method not allowed"})
}
async login(req, res, next) {
let __promisifiedPassportAuthentication = function () {
return new Promise((resolve, reject) => {
passport.authenticate('local', (err, user, info) => {
if(err)reject(err)
if(user === false || user === null)reject({message:"No such user"})
})(req, res, next)
})
}
__promisifiedPassportAuthentication().catch((err)=>{
//How do I get this error to be thrown by the (parent) function login?
// Promise.reject(err)
throw(err)
})
}
护照策略
passport.use( new LocalStrategy({ usernameField: 'email' }, async (email, password, done) => {
let [err, dontcare, care] = [];
let person = {Email: email}
;[err, care] = await to (Familyfe.Person.which(person))
//force err to have some value
err = true
if(err)return done(err);
}));
答案 0 :(得分:1)
只要
,下面代码中的try-catch块就不起作用someFunction
是异步
当然它没有 - someFunction
是异步的并且返回一个promise。除非您承诺try
,否则catch
/ await
无法捕获异步错误(承诺拒绝)。如果您未从someFunction
函数上下文中调用async
,则需要使用普通承诺catch
方法:
try {
await someFunction(()=> {
// ^^^^^
console.log("Callback has been called")
throw new Error("Some error");
});
} catch (error) {
console.log(error.message)
}
或
someFunction(() => {
console.log("Callback has been called")
throw new Error("Some error");
}).catch(error => {
console.log(error.message)
});
当然,someFunction
没有理由接受回调。您应该直接调用someAsyncFunction
并使用它返回的承诺来安装回调
someAsyncFunction().then(() => {
console.log("Callback has been called")
throw new Error("Some error");
}).catch(error => {
console.log(error.message)
});
或根本没有使用async
/ await
try {
await someAsyncFunction()
console.log("'Callback' code has been called")
throw new Error("Some error");
} catch (error) {
console.log(error.message)
}
答案 1 :(得分:0)
我相信如果您await
回调,代码将会起作用,如下所示:
let someFunction = async (callback)=> {
await someAsyncFunction()
await callback()
}
但我认为你可以简化这段代码。你真的需要someFunction
吗?在该代码中,它似乎并没有真正简化任何事情。 (但是,如果您在该功能中进行额外的工作,那么拥有一个单独的功能是有意义的。)
let someAsyncFunction = async () => {
return true
}
// If top level `await` is allowed
try {
await someAsyncFunction()
console.log('someAsyncFunction has finished')
throw "Some error"
} catch (error) {
console.log(error)
}
// If you can't use `await` here, you can just use the built-in Promise
someAsyncFunction()
.then(() => {
throw ("Some error")
console.log("Callback has been called")
})
.catch(error => {
console.log(error)
})