小程序wx.uploadFile异步问题

问题:小程序上传文件后我需要后端返回的一个值,但这个值总是在最后面导致需要这个值的方法总是报错,打印测试后发现这它是异步的。但直接使用 await来等待也不行。 

uploadImg.wxml

<view class="upload-wrap">
  <view class="list-wrap">
    <view class="item" wx:for="{{fileList}}" wx:key="index" wx:for-index="index" wx:for-item="item">
      <image class="file" src="{{item.url}}" data-url="{{item.url}}" bindtap="viewImage"></image>
      <view wx:if="{{!disabled}}" class="icon-delete" data-index="{{index}}" bindtap="delFile">
        <image class="icon-delete" src="/images/common/icon-delete.png" mode="widthFix"></image>
      </view>
    </view>
    <view wx:if="{{!disabled && fileList.length<maxCount}}" class="add-wrap" bindtap="chooseFile">
      <image class="icon-camera" src="/images/common/icon-camera.png" mode="widthFix"></image>
    </view>
  </view>
</view>

uploadImg.js

const app = getApp();
Component({
    properties: {
        pageFileList: {
            optionalTypes: [Array, String],
            value: () => {
                return []
            },
            observer: function (newValue, oldValue) {
                let list;
                if (!newValue) {
                    list = [];
                } else if (typeof newValue == 'string') {
                    list = JSON.parse(newValue);
                }
                this.setData({
                    fileList: list
                })
            }
        },
        disabled: {
            type: Boolean,
            default: false
        },
        maxSize: {
            type: Number,
            value: 5242880, // 5M
        },
        maxCount: {
            type: Number,
            value: 9,
        },
        category: {
            type: String,
            value: 'Personal', // 1:Personal,2:Article,3:Meeting
        },
        name: {
            type: String,
            value: 'Image'
        },
        // 文件类型
        fileType: {
            type: Number,
            value: 1, // 1:Image,2:Video,3:Excel,4:PDF文件
        },
    },

    data: {
        fileList: [],
    },

    methods: {
        // 选择图片
        chooseFile() {
            let choseImgCount;
            let fileListLen = this.data.fileList.length;
            let maxCount = this.data.maxCount;

            // 计算每次可上传的文件数量
            if (fileListLen == maxCount) {
                choseImgCount = 0;
            } else if (maxCount - fileListLen > 9) {
                choseImgCount = 9;
            } else {
                choseImgCount = maxCount - fileListLen;
            }

            wx.chooseImage({
                count: choseImgCount,
                sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
                sourceType: ['album', 'camera'], // 选择图片的来源
                success: (res) => {
                    // 限制最大文件体积
                    let overSizeIndex = res.tempFiles.findIndex(v => v.size > this.data.maxSize);
                    if (overSizeIndex > -1) {
                        let msg = "";
                        if (res.tempFiles.length > 1) {
                            msg = "第" + (overSizeIndex + 1) + "个文件已经超过了最大文件限制:"
                        } else {
                            msg = "该文件已经超过了最大文件限制:"
                        }
                        app.alert.show(msg + (this.data.maxSize / 1024 / 1024).toFixed(0) + "M,请重新上传~");
                        return;
                    }
                    this.uploadFile(res.tempFilePaths);
                }
            });
        },

        // 上传图片
        async uploadFile(tempFilePaths) {
            wx.showLoading({
                title: '上传中...',
                mask: true
            })
            for (let i = 0; i < tempFilePaths.length; i++) {
                await this.uploadFileHandler(tempFilePaths, i);
                if (i == tempFilePaths.length - 1) {
                    this.triggerEvent("uploadFiles", { list: this.data.fileList, name: this.data.name });
                    wx.showToast({
                        title: '上传成功',
                        icon: 'none',
                        duration,
                    })
                }
            }
        },

        uploadFileHandler(tempFilePaths, i) {
            let self = this;
            let fileList = self.data.fileList;
            return new Promise((resolve, reject) => {
                wx.uploadFile({
                    url: app.siteinfo.apiUrl + '', // 需要用HTTPS,同时在微信公众平台后台添加服务器地址
                    filePath: tempFilePaths[i], // 上传的文件本地地址
                    name: 'file', // 服务器定义的Key值
                    header: {
                        'content-type': 'multipart/form-data',
                        'cookie': wx.getStorageSync('cookie')
                    },
                    formData: {
                        uploadDir: self.data.category,
                        fileType: self.data.fileType,
                    },
                    success: function (res) {
                        wx.hideLoading()
                        if (res.statusCode == 200) {
                            let result = JSON.parse(res.data);
                            if (result.status) {
                                let list = [{ name: self.data.name, url: result.data.fileurl }];
                                fileList = fileList.concat(list);
                                self.setData({ fileList });
                                resolve();
                            } else {
                                app.alert.show(result.errmsg, reject(result.errmsg));
                            }
                        } else {
                            app.alert.show('状态:' + res.statusCode + ',提示:' + res.errMsg, reject(res.errMsg));
                        }
                    },
                    fail: function (err) {
                        wx.hideLoading()
                        app.alert.show(err.errMsg, reject(err.errMsg));
                    }
                });
            })
        },

        // 删除图片
        delFile(e) {
            wx.showModal({
                title: '提示',
                content: '确定要删除吗?',
                success: res => {
                    if (res.confirm) {
                        let fileList = this.data.fileList;
                        fileList.splice(parseInt(e.currentTarget.dataset.index), 1);
                        this.setData({ fileList })
                        this.triggerEvent("uploadFiles", {
                            list: fileList,
                            name: this.data.name
                        });
                        wx.showToast({
                            title: '删除成功',
                            icon: 'success',
                            duration: 2000
                        })
                    }
                }
            })
        },

        // 预览图片
        viewImage(e) {
            let urls = this.data.fileList.map(item => { return item.url });
            wx.previewImage({
                current: e.currentTarget.dataset.url,
                urls
            });
        },

    }
})

uploadImg.less

.upload-wrap {
  .list-wrap {
    display: flex;
    flex-wrap: wrap;
    .item {
      position: relative;
      width: 188rpx;
      height: 188rpx;
      margin-top: 40rpx;
      margin-right: calc(~"(100% - 564rpx) / 3");

      .file {
        width: 100%;
        height: 100%;
        vertical-align: middle;
        border-radius: 8rpx;
      }

      .icon-delete {
        width: 40rpx;
        position: absolute;
        right: -10rpx;
        top: -10rpx;
      }
    }
  }

  .add-wrap {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
    width: 188rpx;
    height: 188rpx;
    margin-top: 40rpx;
    border: 1px dashed #979797;
    border-radius: 8rpx;
    background-color: #f9fafb;
    text-align: center;

    .icon-camera {
      width: 50rpx;
      height: 46rpx;
      pointer-events: none;
    }
  }
}

 uploadImg.json

{
  "component": true,
  "usingComponents": {}
}

应用

<upload-img category="Personal" pageFileList="{{form.image}}" maxCount="3" disabled bind:uploadFiles="uploadFiles">
</upload-img>

 data: {
        form: {
            image: '[{"name":"Image","url":"https://wechatmp.uatwechat.com/upload/PersonalCompressed/20230614/20230614114423503.jpeg"}]',
            video: ''
        },
    },



uploadFiles(e) {
        let str = "form." + e.detail.name;
        let list = e.detail.list;
        if (list.length > 0) {
            this.setData({
                [str]: JSON.stringify(e.detail.list)
            })
        } else {
            this.setData({
                [str]: '',
            })
        }
    },

app.alert方法封装 alert.js,然后在在app.js引入可使用

const show = (message, showCancel, successCallback = function() {}) => {
    wx.showModal({
        title: '提示',
        content: message,
        confirmColor: '#DB6276',
        showCancel: showCancel,
        success(res) {
            if (res.confirm) {
                successCallback();
            }
        }
    })
}

module.exports = {
    show
}

小程序上传多张图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/729745.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑神话悟空-吉吉国王版本【抢先版】

在中国的游戏市场中&#xff0c;一款名为“黑神话悟空”的游戏引起了广泛的关注。这款游戏以中国传统的神话故事“西游记”为背景&#xff0c;创造了一个令人震撼的虚拟世界。今天&#xff0c;我们要来介绍的是这款游戏的一种特殊版本&#xff0c;那就是吉吉国王版本。 在吉吉国…

邮件推送服务商有哪些核心功能?怎么选择?

邮件推送服务商支持哪些营销工具&#xff1f;推送性能如何评估&#xff1f; 邮件推送服务商的核心功能可以帮助企业更高效地管理和优化其电子邮件营销活动&#xff0c;从而提升客户参与度和转化率。AokSend将详细介绍邮件推送服务商的一些核心功能。 邮件推送服务商&#xff…

鸿蒙仓颉编程语音来了,ArkTs语言危矣?

鸿蒙仓颉编程语言来了&#xff0c;请允许我哭会~~呜呜呜~~我的arkts啊 仓颉编程语言文档地址文档中心 鸿蒙直播大会开始一个小时了&#xff0c;地址华为开发者大会&#xff08;HDC 2024&#xff09;主题演讲 同时api12 不再是秘密了 各位&#xff01;公开啦 api12 公开地址…

如何开启Claude 3的Artifacts功能以及如何注册Claude3

就很突然&#xff0c;Claude 3.5&#xff0c;它来了&#xff01; Anthropic发布3.5系列第一个版本Claude 3.5 Sonnet。在多个关键指标中&#xff0c;GPT-4o几乎被吊打&#xff01; 另外Claude 3.5 Sonnet是免费的&#xff0c;提供了跟gpt-4o一样的次数。更高的速度和次数&…

maxwell源码编译安装部署

目录 1、组件环境 2、maxwell安装前提 3、maxwell安装 3.1、maxwell下载 3.1.1、最新版本下载 ​编辑 3.1.2、历史版本下载 3.2、maxwell安装 3.3、maxwell配置 3.2.1、mysql开启binlog 3.3.2、maxwell元数据配置 3.3.3、maxwell配置任务 4、maxwell部署问题 4.1、utf…

Jenkins macos 下 failed to create dmg 操作不被允许hdiutil: create failed - 操作不被允许?

解决方案&#xff1a; 打开设置&#xff0c;选择“隐私与安全”&#xff0c;选择“完全磁盘访问权限”&#xff0c;点击“”&#xff0c;选择jenkins的路径并添加。 同理&#xff0c;添加java的访问权限。

【Android】记录在自己的AMD处理器无法使用Android studio 虚拟机处理过程

文章目录 问题&#xff1a;无法在AMD平台打开Android studio 虚拟机&#xff0c;已解决平台&#xff1a;AMD 5700g系统&#xff1a;win10专业版1、在 amd平台上使用安卓虚拟机需要安装硬件加速器2、关闭win10上的系统服务 问题&#xff1a;无法在AMD平台打开Android studio 虚拟…

java 八股文最集全网站

弟弟快看-教程&#xff0c;程序员编程资料站 | DDKK.COM

关于微信小程序取消获取用户昵称的一些思考

官方说明&#xff0c;有部分小程序乱用授权&#xff0c;强迫用户提交头像和昵称。 核心是微信担心用户信息被滥用。 其一 &#xff0c;微信头像经常是本人真是照片&#xff0c;在现在人工智能算法的加持下&#xff0c;人脸数据太容易被套取。 其二&#xff0c;微信名称同理&…

使用Python发送电子邮件:轻松实现自动化沟通

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 1. 为什么使用Python发送电子邮件&#xff1f; 在当今这个信息爆炸的时代&#xff0c;电子邮件已经成为了日常生活中不可或缺的一部分。无论是工作还是生活&#xff0c;都可能需要通过电子邮件与他人进行沟通。而Py…

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法(以太网)

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法(以太网) 具体连接伺服驱动器的步骤可参考以下内容: 启动InoDriverShop, 新建或打开工程 如下图所示,选择在线,选中SV660F图标,右侧通信类型选择“TCP—DCP”,点击下一步,同时要选择自己当前使用的网卡…

【文档+源码+调试讲解】国风彩妆网站springboot

摘 要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一…

如何使用 NFTScan NFT API 在 Sei 网络上开发 Web3 应用

Sei Network 是一个专为交易而设计的 Layer 1 区块链。它建立在 Cosmos SDK 上&#xff0c;使用一种称为 Tendermint BFT 的新型共识机制。不仅专攻 DeFi 领域的加密资产交易&#xff0c;更在游戏、社交媒体和 NFTs 等热门 verticals 构建了多功能区块链生态系统。Sei Network …

【盘点】8大电商选品思路,实操策略大公开!

1、以人选品 顾名思义&#xff0c;先确定想做的目标人群&#xff0c;再挖掘人群的需求。比如&#xff0c;小个子&#xff0c;这种细分市场&#xff0c;这里的人代表的是一个群体&#xff0c;可以是职业&#xff0c;可以是年龄段可以是一种称呼。如果未能明确目标市场和消费者需…

ConcurrentHashMap(应对并发问题的工具类)

并发工具类 在JDK的并发包里提供了几个非常有用的并发容器和并发工具类。供我们在多线程开发中进行使用。 5.1 ConcurrentHashMap 5.1.1 概述以及基本使用 在集合类中HashMap是比较常用的集合对象&#xff0c;但是HashMap是线程不安全的(多线程环境下可能会存在问题)。为了…

Docker之overlay2的迁移

原因 docker默认将文件及其容器放置在了系统盘的挂载区内&#xff0c;如果长期使用会发现系统挂载区被overlay2挤爆了,因此在一开始我们将其迁移在大容量外挂磁盘上,就可以避免系统盘被挤爆,放心使用. 具体操作 # 停止容器 systemctl stop docker# 修改容器配置&#xff0c…

STM32CubeMX WS2812B灯驱动

一、WS2812B 数据发送速度可达800Kbps。 数据协议采用单线归零码的通讯方式&#xff0c;像素点在上电复位以后&#xff0c;DIN端接受从控制器传输过来的数据&#xff0c;首先送过来的24bit数据被第一个像素点提取后&#xff0c;送到像素点内部的数据锁存器&#xff0c;剩余的…

MyBatis基础教程

文章目录 一、MyBatis基本使用1.1简介1.2搭建MyBatis环境1.2.1安装MyBatis1.2.2创建MyBatis核心配置文件1.2.3创建mapper接口1.2.4创建MyBatis映射文件1.2.5实现增加功能 1.3整合log4j1.4修改与删除功能1.5查询功能1.5.1查询单个实体类对象1.5.2查询所有用户信息 二、核心配置文…

数据结构经典面试之链表——C#和C++篇

文章目录 一、链表的基本概念二、链表的操作三、定义链表的节点结构体&#xff08;C#&#xff09;四、定义链表的基本操作类&#xff08;C#&#xff09;五、创建一个链表实例并进行基本操作演示&#xff08;C#&#xff09;六、编写一个自定义链表操作函数&#xff08;C&#xf…

react学习——09react中props属性

1、基本使用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 移动端适配--><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>1_props基…