zoukankan      html  css  js  c++  java
  • promise循环调用异步函数(以图片上传为例)

    引言:我们在项目中经常会遇到图片上传的情况,一般图片上传我们为了考虑性能和其他因素,因此经常会设计为将图片数组循环单个图片上传;因此这就使用了promise的for循环

    uploadImages(){   //总的图片上传函数
                    return new Promise((resolve, reject) => {
                        let vm = this;
                        let uploadNum = 0
                        console.log('imgParams',vm.imgParams)
                        if (vm.imageTemArr.length > 0) {
                            for(let i= 0;i<vm.imageTemArr.length;i++){
                                imageService.uploadImage(vm.imgParams, vm.imageTemArr[i]).then(res => {    //单个图片上传函数
                                    uploadNum++
                                    if(uploadNum>=vm.imageTemArr.length){
                                        // 重新获取图片
                                        imageService.getImgInfo(vm.imgParams).then(res=>{
                                            console.log('add 影像信息',res)
                                            let resData = res.result.record
                                            let resName = []
                                            resData.forEach((item,index)=> {
                                                resName.push(item.file_name)
                                            });
                                            let params = {
                                                "resType":vm.imgParams.resType,
                                                "tablePk":vm.imgParams.headerId,
                                                "resName":resName
                                            }
                                            console.log('this.addimgParams',this.imgParams)
                                            resolve("S");
                                        }).catch(error=>{
                                            reject("E");
                                        })
                                    }
    
                                }).catch(error => {
                                    let vm = this;
                                    this.showPrompt('图片上传失败,请重新点击上传!');
                                    console.log("图片上传失败,错误信息:" + error);
                                    reject("E");
                                });
                            }
                        }
                    });
                }

    话不多说先上代码:

    在这里我们贴出了总的函数代码下面我们将单个图片上传的接口贴出来

    uploadImage(params, imgData){
            let formData = new FormData();
            console.log("params.documentNumber"+params.documentNumber);
            formData.append('documentNumber',params.documentNumber); // 单据编号
            formData.append('userId',params.userId);  // 上传用户
            formData.append('resType',params.resType); // 单据类型
            formData.append('file',imgData.file); // bolb二进制文件流
            formData.append('fileName',imgData.imageName); // 文件名字
            let url = process.env.ossUrl + "/pictures/upload";
            return Axios.postFormData(formData,url);
        }

     总结:我们首先在uploadImages函数中return一个promise对象;在promise对象中首先声明一个计数器uploadNum,用于记录当前已经上传图片的个数;然后对于图片数组进行循环调用单个图片上传函数uploadImage;uploadImage返回的也是一个promise对象,如果成功了则计数器uploadNum++;并判断当前图片是不是图片数组中的最后一张图片,如果是最后一张图片,则重新调用图片获取接口,用于刷新图片并resolve("S").

  • 相关阅读:
    (原创)C++ 同步队列
    (原创)用C++11的std::async代替线程的创建
    C语言宏应用-------#define STR(X) #X
    c++中数据表如何转成业务实体--map和结构体的相互转换
    线程池的陷阱
    java中map和对象互转工具类的实现示例
    3.python元类编程
    人生苦短,我用python(目录)
    11.多线程、多进程和线程池编程
    10.python3实用编程技巧进阶(五)
  • 原文地址:https://www.cnblogs.com/mingbo-zhang/p/10190389.html
Copyright © 2011-2022 走看看