将Promise转换为异步函数

问题描述

我对javascript很陌生,正在尝试将以下代码转换为异步函数。据我了解,异步函数总是返回Promise。

// working code
export const getUser = (req: Express.Request,res: Express.Response) =>
  new Promise((resolve,reject) => {
    passport.authenticate('oauth-bearer',{ session: false },(err,user) => {
      if (err) reject(err)
      if (user) resolve(user)
      else reject('Unauthorized')
    })(req,res)
  })

此承诺与await关键字一起使用:

const user = await getUser(req,res)

到目前为止,我的尝试始终返回“功能”,而不是已解决或被拒绝的Promise:

// failing code
export const getUser = (req: Express.Request,res: Express.Response) =>
  async () => {
      return await passport.authenticate('oauth-bearer',user) => {
      if (err) throw err
      if (user) return user
      else throw 'Unauthorized'
    })(req,res)
  }

感谢您指出我在这里做错了。

解决方法

您获得的是函数而不是Promise,因为new Promise立即创建了一个承诺,但是async () => {}仅在被称为的时候创建了一个承诺

...但这是您最少的问题。

async功能是管理现有承诺的工具。它们不能与promise构造函数自由互换。

passport.authenticate不会返回承诺,因此您无法使用async来管理承诺。

,

如上所述,您不能在此使用它。但是,如果您需要编写一个异步函数,它将看起来像这样。

# actual number
>>> int.from_bytes(int(-1234324354354353432432424 + 1).to_bytes(64,'little',signed=True),signed=True)
-1234324354354353432432423