从JS类解析异步值

时间:2019-01-04 23:28:14

标签: javascript vue.js request vuex

简而言之:我需要从Auth0请求一个令牌,然后才能检索用户信息(全部在Vuex调用的Vue插件内)。

我目前有两类-一类用于处理令牌,另一类用于实际检索配置文件。

export class Token {
  constructor () {
    this.options = { method: 'POST',
      url: 'https://.auth0.com/oauth/token',
      headers: { 'content-type': 'application/json' },
      body: '{"client_id":"","client_secret":"","audience":"","grant_type":"client_credentials"}' }
  }

  async getToken () {
     try {
       this.request = request(this.options, function (error, response, body) {
         if (error) {
           console.error(error)
         } else {
           let parsed = JSON.parse(body)
           let token = parsed.access_token
           return token
         }
       })
       let blah = await this.request
       console.log(blah)
     } catch (err) {
       console.error(err)
     }
  }
}

export default class Profile {
  constructor () {
    const token = new Token()
    let result = token.getToken()
    //console.log(result)
    this.auth0Manage = new auth0.Management({
      domain: '.auth0.com',
      token: `${result}`
    })
  }

  getProfile () {
    return new Promise((resolve, reject) => {
      let idToken = localStorage.getItem('id_token')
      let decoded = jwt_decode(idToken)
      let userId = decoded.sub
      this.auth0Manage.getUser(userId, function (err, data) {
        if (err) {
          console.error(err)
        }
        resolve(data)
      })
    })
  }
}

我期望以下流程:

获取令牌>获取个人资料。它不必位于两个类中(本来不是,但是我不能在没有首先获得令牌的情况下实例化Profile的构造函数,而这必须是它自己的类(afaik)。谢谢!

1 个答案:

答案 0 :(得分:0)

好像您没有在配置文件构造函数中等待getToken结果。问题是,构造函数始终是同步的。因此,为了等待令牌,您需要执行类似的操作,使Profile#auth0manage为异步值并等待。也许像:

export default class Profile {
  constructor () {
    let token = new Token()
    this.auth0Manage = new Promise((resolve, reject) => {
      token.getToken().then((result) => {
        return new auth0.Management({
          domain: '.auth0.com',
          token: `${result}`
        })
      }).then(resolve, reject)
    })
  }

  async getProfile () {
    let auth0Manage = await this.auth0Manage
    return new Promise((resolve, reject) => {
      let idToken = localStorage.getItem('id_token')
      let decoded = jwt_decode(idToken)
      let userId = decoded.sub
      auth0Manage.getUser(userId, function (err, data) {
        if (err) {
          console.error(err)
        }
        resolve(data)
      })
    })
  }
}

注意事项是,如果您在getToken中遇到错误,则每次对getProfile的调用都将返回相同的错误。因此,您可能希望以某种方式处理该问题。另外,您还必须记住要等待this.auth0Manage的每次使用。理想情况下,您可以执行类似将auth0Manager传递给Profile的构造函数的操作,以便在提取令牌之前不会尝试创建配置文件。倾向于更好地锻炼以这种方式做事。