第三套方案(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);
},
});
});
};
- 通过async+await将异步循环 变为 必要等当前Promise执行完再进行下次循环;
- 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);
}
- 因为upload()返回的是Promise对象,所以方便用then()获取值
//temp待处理的图片实参
upload(temp).then(res=>{
//也方便进行下一步待处理...
})
- 结果: