【问题标题】:Vue, fetch returns empty arrayVue, fetch 返回空数组
【发布时间】:2019-12-11 19:56:00
【问题描述】:

我正在我的 vue-cli 项目中获取一些数据。

我正在使用 Vuex 来存储数据。

除了我得到一个空数组之外,这一切都运行成功,我已经签入了 Postman,并且它运行良好。

正如您在我的操作中看到的,我在if 声明中提交了我的提交,目前已被注释掉并移动。但是当在那里运行时,我得到了一个 Promise 返回。作为我的代码的当前版本,我得到一个空数组。

我真的看不出我的错误是什么,所以我最好的选择是你们能够看到我错过了什么。

首先我有我的行动:

export default {

async getProLanguages({ commit }) {
    commit(C.PROLANGAUGE_DATA_PENDING);
    try {
        const res = await fetch('https://dev-webapp-kimga5xexrm3o.azurewebsites.net/api/ProLang', {
            method: 'GET',
            mode: 'cors',
            headers: {
                'Content-Type': 'application/json',
                'Accept': 'application/json',
                'Authorization': 'Bearer xxx'
            }
        });
        if (res.status === 200) {
            console.log(res);
            // commit(C.PROLANGAUGE_DATA_SUCCESS, JSON.stringify(res.json()));
        }
        else {
            commit(C.PROLANGAUGE_DATA_NO_CONTENT);
        }
        console.log(res)
        return commit(C.PROLANGAUGE_DATA_SUCCESS, JSON.stringify(res.json()));
    }
    catch (e) {
        commit(C.PROLANGAUGE_DATA_FAILURE);
    }
}

还有我的突变:

 /**
 *  Indicates that programming language has succeded 
 * 
 * @param state 
 * @param  payload 
 */
[C.PROLANGAUGE_DATA_SUCCESS](state, payload) {
    state.programmingLanguages = { ...state.programmingLanguages, loading: false, error: false, noContent: false, items: payload }
},

我有我的默认状态,它被导入到state.js

const getDefaultState = () => ({
  programmingLanguages: {
    loading: false,
    error: false,
    noContent: false,
    items: [
      {
        id: undefined,
        name: undefined
      }
    ]
  }
});

我用beforeRouteEnter 调用我的操作:

beforeRouteEnter(to, from, next) {
  store.dispatch('programmingLanguages/getProLanguages').then(() => {
    next();
  });
}

最后在我的组件中,我从 Vuex 导入 mapState

computed: {
  ...mapState({
    prolangs: state => state.programmingLanguages.programmingLanguages.items
  })
}

【问题讨论】:

  • 应该是commit(C.PROLANGAUGE_DATA_SUCCESS, res.json());
  • 我实际上只是尝试过,它现在返回一个承诺,但不知道如何处理
  • 我明白了,你需要const items = await res.json() 然后commit(C.PROLANGAUGE_DATA_SUCCESS, items);

标签: javascript vue.js fetch vuex


【解决方案1】:

我认为像items = await res.json() 这样的事情,然后提交items 可能是一个前进的方向(确保所有承诺都得到解决)。

【讨论】:

  • 实用提示:在渲染inline code formatting 时,Markdown 中只需要单个反引号。只有一个块才需要三个反引号(代码围栏)。单个反引号更容易编辑。
猜你喜欢
  • 2019-07-22
  • 1970-01-01
  • 2021-05-21
  • 2014-04-24
  • 2017-11-27
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多