axios getting/posting 请求时加载栏

Loading bar when axios getting/posting request

我正在尝试使用 Vue ProgressBar 在我的项目上创建一个加载栏,它在我的路线上有效,但在 Axios 获取或发布请求时不起作用。

这是我启动加载栏时的项目代码,

<script>
    import Swal from 'sweetalert2';
    import Editor from '@tinymce/tinymce-vue';
    export default {
        components: {
            'editor': Editor
        },
        title() {
            return 'Stock group data';
        },
        data() {
            return {
                stockgroup: {},
                user: {},
            }
        },
        created() {
            this.$Progress.start();
            this.loadDataWarehouse();
            this.loadUser();
            this.$Progress.finish();
        },
        methods: {
            async loadDataWarehouse() {
                const response = await axios.get('/api/stock-group/' + this.$route.params.id);
                this.stockgroup = response.data;
            },
            async loadUser() {
                const resp = await axios.get('/api/contact-list');
                this.user = resp.data;
            },
        },
    }

</script>

this.$Progress.start() 行是执行加载栏的地方。

但在我这样做之前,我已经阅读了我们必须在默认 Vue 应用程序上添加代码的文档。我的意思是像 App.vue

所以我将此代码添加到我的 App.vue

但是当我运行它并请求获取数据时,我不知道为什么它不显示加载栏。 你可以在这里看到它。

有人能帮帮我吗? 请...

您正在查看正在调用的 async 个函数!

事实上,您正在做的是显示进度条,并在调用两个 async 函数后很快将其隐藏。

这里有两个选择。

  1. 使 hook async 和 await inside.

    created: async () => {
     this.$Progress.start();
     // wait for the async to finish
     await this.loadDataWarehouse();
     await this.loadUser();
     // then hide the progress bar
     this.$Progress.finish();
    },
    

  1. 将两者都推入 promises 数组并等待 - 这在可读性方面并不那么优雅,但在性能方面可能会更好,因为它不会等待第一个承诺return 与选项 1 不同,执行第二个承诺。

    created: () => {
     // promises array
     let promises = [];
     // this context
     const self = this;
     this.$Progress.start();
     // push into the array
     promises.push(this.loadDataWarehouse());
     promises.push(this.loadUser());
     // then hide the progress bar
     Promise.all(promises).then(()=>{
       self.$Progress.finish();
     })
    },
    

如果您希望在每个请求上显示进度条而无需重复开始和结束代码。你可以尝试使用 axios interceptor

this.axios.interceptors.request.use(config => {
this.$Progress.start(); 
    return config;
});
this.axios.interceptors.response.use(
    response => {
        this.$Progress.finish(); 
        return Promise.resolve(response);
    },
    error => {
        this.$Progress.finish(); 
        return Promise.reject(error);
    }
);