小程序使用 Promise.all 完成文件异步上传
2021-04-23 16:10
1066 查看
小程序使用 Promise.all 完成文件异步上传
extends [微信小程序开发技巧总结(二) -- 文件的选取、移动、上传和下载 - Kindear - 博客园 (cnblogs.com)]
在上述文章中我们提到了两种文件上传的方式:
-
使用
for
循环遍历优点:接近并发上传,上传速度较快
缺点:无法保证返回结果的顺序
-
采用递归方式上传
优点:保证了文件的返回顺序和上传顺序一致,且对服务器负载更小
缺点:由于同步顺序执行上传过程,耗费时间过长
那么有没有一种方式可以让上传异步执行并且保证返回的顺序呢?
鱼与熊掌可以兼得,这波啊,这波不亏
这就引入本篇文章的主角
Promse.all异步并行机制了
关于
Promise的两种机制,我就不再赘述,请看
参考文档
项目结构
|--upload |--upload.js |--upload.json |--upload.wxml |--upload.wxss |--profunc.js
本文以云开发图片上传举例
代码展示
profunc.js
const cloudpath = 'baseimg'; function CloudUploadImage(path) { // 本地文件路径 return new Promise(function (resolve, reject) { wx.getFileInfo({ filePath: path, success(ans) { wx.cloud.uploadFile({ cloudPath: cloudpath + '/' + ans.digest + '.png', filePath: path, success: res => { resolve(res) }, fail(res) { reject('upload fail') } }) } }) }) } module.exports={ CloudUploadImage:CloudUploadImage }
upload.js
// pages/upload/upload.js const cwx = require('profunc.js'); Page({ /** * 页面的初始数据 */ data: { imgList:[] }, UploadImage(){ let imglist = this.data.imgList; var promisetasks = [] for(var i=0;i<imglist.length;i++){ promisetasks.push(cwx.CloudUploadImage(imglist[i])) } wx.showLoading({ title:'图片上传中' }) Promise.all(promisetasks).then(res=>{ console.log(res) //具体处理写在如下 }) }, ChooseImage() { wx.chooseImage({ count: 4, //默认9 sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有 sourceType: ['album'], //从相册选择 success: (res) => { if (this.data.imgList.length != 0) { this.setData({ imgList: this.data.imgList.concat(res.tempFilePaths) }) } else { this.setData({ imgList: res.tempFilePaths }) } } }); }, ViewImage(e) { wx.previewImage({ urls: this.data.imgList, current: e.currentTarget.dataset.url }); }, DelImg(e) { this.data.imgList.splice(e.currentTarget.dataset.index, 1); this.setData({ imgList: this.data.imgList }) }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, /** * 生命周期函数--监听页面显示 */ onShow: function () { }, /** * 生命周期函数--监听页面隐藏 */ onHide: function () { 198d }, /** * 生命周期函数--监听页面卸载 */ onUnload: function () { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function () { }, /** * 页面上拉触底事件的处理函数 */ onReachBottom: function () { }, /** * 用户点击右上角分享 */ onShareAppMessage: function () { } })
upload.wxml
<view class="cu-bar bg-white margin-top"> <view class="action"> 图片上传 </view> <view class="action"> {{imgList.length}}/4 </view> </view> <view class="cu-form-group"> <view class="grid col-4 grid-square flex-sub"> <view class="bg-img" wx:for="{{imgList}}" wx:key="index" bindtap="ViewImage" data-url="{{imgList[index]}}"> <image src='{{imgList[index]}}' mode='aspectFill'></image> <view class="cu-tag bg-red" catchtap="DelImg" data-index="{{index}}"> <text class="cuIcon-close"></text> </view> </view> <view class="solids" bindtap="ChooseImage" wx:if="{{imgList.length<4}}"> <text class="cuIcon-cameraadd"></text> </view> </view> </view> <view class="padding flex flex-direction"> <button class="cu-btn bg-green lg" bindtap="UploadImage">上传</button> <!-- <button class="cu-btn bg-red margin-tb-sm lg">嫣红</button> --> </view>
upload.wxss
使用了
colorui样式组件,请参考参考文档下载
/* pages/upload/upload.wxss */ @import '/colorui/main.wxss';
参考文档
相关文章推荐
- AjaxFileUpLoad 文件异步上传Demo(模仿官方网站,后台使用.net一般处理程序)
- sourceforge.net专题:空间申请使用、绑定域名、上传文件安装程序
- 信息编辑,上传文件编辑、删除,用户个人资料修改程序完成 2004-08-21
- 使用java程序用FTP的方式的上传文件
- 使用Jquery From插件实现异步上传文件的功能
- ASP.NET MVC 使用Uploadify实现多文件异步无刷新上传
- 解析ajaxFileUpload 异步上传文件简单使用
- 完成一个学生管理程序,使用学号作为键添加5个学生对象,并可以将全部信息保存在文件中,可以实现对学生信息的学号查找,输出全部学生信息的功能。
- MVC文件上传01-使用jquery异步上传并客户端验证类型和大小
- 使用libcurl进行异步并发访问与文件上传
- 使用DWR框架完成文件上传与下载
- html使用iframe实现伪异步表单,实现无刷新上传文件时遇到的问题
- 使用ajaxFileUpload与SpringMVC实现异步上传下载文件并返回json数据
- 微信小程序中使用Promise进行异步流程处理
- 完成一个学生管理程序,使用学号作为键添加5个学生对象,并可以将全部信息保存在文件中,可以实现对学生信息的学号查找,输出全部学生信息的功能。
- ajax异步上传文件FormDate方式,html支持才可使用
- Android带进度条的文件上传,使用AsyncTask异步任务
- 使用AjaxFileUpload.js实现异步文件上传示例
- [Ajax] 使用Ajax异步上传图片文件(非Form表单提交)
- 使用Ajax异步上传文件