有啥方法可以将变量分配给 axios 请求并在 onUploadProgress 中访问它

Posted

技术标签:

【中文标题】有啥方法可以将变量分配给 axios 请求并在 onUploadProgress 中访问它【英文标题】:Is there any way to assign a variable to axios request and access it in onUploadProgress有什么方法可以将变量分配给 axios 请求并在 onUploadProgress 中访问它 【发布时间】:2020-05-09 07:47:10 【问题描述】:

我在 Vue 中使用以下代码。在这里,我使用多个 axios 请求同时上传多个文件。在这段代码中一切正常。 但我想要一种方法来查看文件上传的百分比。请参阅具有进度属性的文件对象的数组 this.upload。所以我想为特定对象更新这个属性。所以我可以向用户显示文件上传进度

         for(var file of event.target.files)
            if(!this.isValidFormat(file)) continue;

            var thumb = await this.getThumb(file);
            this.upload.push(
                name: file.name,
                index: parseInt(Math.round(file.size / (1024))),
                size: (file.size / (1024 * 1024)).toFixed(2) + ' MB',
                progress: 0,
                thumbnail: thumb,
                path: null
            );

            const formData = new FormData();
            formData.append('image', file, file.name);
            formData.append('path', 'tmp');
            formData.append('index', increment);
            axios.post('web/upload', formData, 
                onUploadProgress: progressEvent => 
                    //console.log(this.config);
                    const index = parseInt(Math.round(progressEvent.total / 1024));
                    //console.log(index)
                    var u = this.upload.find(u => u.index == index);
                    if(u !== undefined)
                        u.progress = Math.floor((progressEvent.loaded * 100) / progressEvent.total);    
                    

                
            ).then(res => 
                this.upload[res.index].path = res.path;
                console.log(this.upload)
            );
            increment++;
        

【问题讨论】:

【参考方案1】:

您可以使用 vuex 提交值,并通过 getter 在您想要的地方使用它。

https://vuex.vuejs.org/guide/mutations.html

https://vuex.vuejs.org/guide/getters.html

【讨论】:

【参考方案2】:

您可以使用 bind() 向函数添加额外的第一个参数,而不是使用箭头函数 onUploadProgress,这将是对相应 file 对象的引用:

  for(var file of event.target.files)
        if(!this.isValidFormat(file)) continue;

        var thumb = await this.getThumb(file);
        const fileObject = 
            name: file.name,
            size: (file.size / (1024 * 1024)).toFixed(2) + ' MB',
            progress: 0,
            thumbnail: thumb,
            path: null
        ;
        this.upload.push(fileObject);

        const formData = new FormData();
        formData.append('image', file, file.name);
        formData.append('path', 'tmp');
        formData.append('index', increment);
        axios.post('web/upload', formData, 
            onUploadProgress: this.calcProgress.bind(this, fileObject)
        ).then(res => 
            this.upload[res.index].path = res.path;
            console.log(this.upload)
        );
        increment++;
    

function calcProgress(fileObj, progressEvent)

     fileObj.progress = Math.floor((progressEvent.loaded * 100) / progressEvent.total);    

【讨论】:

以上是关于有啥方法可以将变量分配给 axios 请求并在 onUploadProgress 中访问它的主要内容,如果未能解决你的问题,请参考以下文章

将“this”对象分配给函数内的变量有啥用? [复制]

如何将变量从 axios 获取请求传递给 vuejs 中的子组件?

将oracle日期分配给SSIS变量

有啥方法可以将变量传递给 django 元类?

如何将字符串列分配给变量并在 Bash 脚本的输出中引用它

如何从转义闭包中获取值并将其分配给变量并在表格视图中显示