上传图片 保证图片顺序&缩短耗时(for循环+async await +promise)
发布于 3 年前 作者 xiaofang 4349 次浏览 来自 分享

第三套方案(for循环中进行Promise异步操作)

之前上传图片发现for循环异步上传图片导致图片顺序混乱,修改成递归上传发现处理图片时间变长,经网友提醒async+await的方法,第三胎的方案出产了!
__for循环__+__async await__+__promise__



1.封装__uploadImg__函数 处理请求,并return resolve(结果)
//循环中如果后一个Promise的执行依赖与前一个Promise的执行结果(即必要等当前Promise执行完了再进行下次循环)
//img 为待传图片形参
const uploadImg = function (img, i) {
  return new Promise((resolve, reject) => {
    //cloudPath为文件名
    let cloudPath =
      "postImage/" + new Date().getTime() + img[i].match(/\.[^.]+?$/)[0];
    //上传存储
    wx.cloud.uploadFile({
      cloudPath,
      filePath: img[i],
      success: (res) => {
        resolve(res.fileID);
      },
      fail: (err) => {
        reject(err);
      },
    });
  });
};
  1. 通过async+await将异步循环 变为 必要等当前Promise执行完再进行下次循环
  2. Promise.all( 所有返回的promise )将数据return
    //img为待传图片形参
    async function upload(img) {
    //fileIDs为多个Promise容器
        let fileIDs = [];
        for (let i = 0, len = img.length; i < len; i++) {
        //await uploadImg函数(必须是Promise)
            fileIDs.push(await uploadImg(img, i));
       }
        return Promise.all(fileIDs);
   }
  1. 因为upload()返回的是Promise对象,所以方便用then()获取值
//temp待处理的图片实参
upload(temp).then(res=>{
//也方便进行下一步待处理...
})
  1. 结果:
回到顶部