调度异步操作

时间:2019-01-18 19:38:45

标签: javascript vue.js

将动作更改为异步后,我将无法分派该动作。每当我进行调度时,它都会以值false进入导管。这是我的页面,我在该页面上从挂接的钩子分派动作(我也尝试过创建)

mounted () {
  this.$store.dispatch('productById', this.$route.params['id']).then((response) => {
    this.product = response
  })
  .catch(err => {
    console.log(err)
  })
}

这是我的行动

async productById ({commit}, payload) {
  const AuthStr = await getAdminOrRespondentAuth()
  return new Promise((resolve, reject) => {
    commit(PRODUCT_BY_ID)
    axios.get(`${API_BASE}/products/${payload}`, {
      params: {
        origin: '1'
      },
      transformRequest: [function (data, headers) {
        delete headers.common.Authorization
        headers.Authorization = AuthStr
        return data
      }],
      paramsSerializer: params => parseParams(params)
    }).then(response => {
      if (response.status === 200) {
        commit(PRODUCT_BY_ID_SUCCESS, response.data)
        resolve(response.data)
      } else {
        reject(response)
      }
    })
    .catch(err => {
      if (err.response.data.idStatus === 1) {
        commit(PRODUCT_BY_ID_SUCCESS, err.response.data.data)
        reject(err)
      }
    })
  })
}

当Vue进入已安装的挂钩时,它将“调度动作”并直接进入catch块,而不调用我的动作。我的动作未执行。

如果我将操作更改为同步,则一切正常。我需要此操作异步,因为 getAdminOrRespondentAuth 函数调用了oidc异步方法来恢复用户。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

@ Samurai8是正确的。谢谢您的帮助。我的getAdminOrRespondentAuth没有正确返回承诺。纠正功能错误后,一切恢复正常。这是产生错误的函数,描述如下:

async function getAdminOrRespondentAuth () {
  let mgr = new Mgr()
  var adminToken = await mgr.getToken()
  if (adminToken !== false) {
    return 'Bearer '.concat(adminToken)
  } else {
    let usrToken = localStorage.getItem('user-token')
    return 'Bearer '.concat(usrToken)
  }
}

这是起作用的功能:

async function getAdminOrRespondentAuth () {
  var adminToken = ''
  return new Promise(async (resolve, reject) => {
    let mgr = new Mgr()
    try {
      adminToken = await mgr.getToken()
    } catch (error) {
      adminToken = error
    }
    if (adminToken !== false) {
      resolve('Bearer '.concat(adminToken))
    } else {
      let usrToken = localStorage.getItem('user-token')
      if (usrToken !== null) {
        resolve('Bearer '.concat(usrToken))
      } else {
        resolve('')
      }
    }
  })
}