捕获回调函数引发的错误

时间:2018-03-01 18:12:40

标签: javascript callback async-await

我已将异步函数与回调相结合,因为我需要异步函数来等待另一个异步函数。回调抛出了我需要捕获的错误。如何捕获异步函数调用的回调中抛出的错误?只要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);

}));

2 个答案:

答案 0 :(得分:1)

  

只要someFunction是异步

,下面代码中的try-catch块就不起作用

当然它没有 - 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)
  })