【问题标题】:Catch error in Component from async Vuex Action从异步 Vuex 操作中捕获组件中的错误
【发布时间】:2018-03-03 04:24:30
【问题描述】:

我有一个异步操作,如下所示:

export const fetchTweets = async ({ commit, state }) => {
  const tweetFetchError = error => {
    // throw here?
  }
  try {

    const { oAuthAccessToken, oAuthAccessTokenSecret, user: { id } } = state

    const { data, errors } = await api.fetchTweets(oAuthAccessToken, oAuthAccessTokenSecret, id)

    if (errors && Object.keys(errors).length) return tweetFetchError(errors)

    commit(types.SET_TWEETS, {
      tweets: data
    })
  } catch (error) {
    tweetFetchError(error)
  }
}

我从我的组件中调用,如下所示:

methods: {
    ...mapActions(['fetchTweets']),
    async handleFetchTweets () {
      try {
        await this.fetchTweets()
      } catch (error) {
        console.log('errored')
        this.$message.error('Error fetching tweets')
      }
    }
},

我在mounted中调用handleFetchTweets

我的问题是,如何在组件中捕获错误?在Action中,这个方法tweetFetchError在出现错误时会被正确调用,但是我不确定如何在组件的try/catch中触发catch

【问题讨论】:

    标签: vue.js async-await try-catch vuex


    【解决方案1】:

    您需要在fetchTweets 方法中捕获错误后抛出该错误:

      ...
      } catch(error) {
        tweetFetchError(error)
        throw error;
      }
    }
    

    并使用返回的 Promise 的 .catch 处理程序捕获错误:

    async handleFetchTweets () {
      await this.fetchTweets().catch((error) => {
        console.log('errored')
        this.$message.error('Error fetching tweets')
      });
    }
    

    【讨论】:

    • 当我这样做时,我不会在控制台中出现“错误”(这表明我的 catch 在组件中工作,但我只是看到 Uncaught (in promise) Error: Network Error at createError (createError.js?f777:16) at XMLHttpRequest.handleError (xhr.js?14ed:87)
    • 哦,是的,因为它是一个异步方法,它返回一个 Promise,所以你需要使用 Promise 的 catch 方法而不是 try/catch。查看我的编辑
    猜你喜欢
    • 2017-01-11
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2017-03-23
    • 2015-05-31
    相关资源
    最近更新 更多