原方案是for遍历(没有改良) 异步导致获取的fileID混乱
- 云存储里图片是按照顺序上传的,原本以为团队做了递归优化,后来发现不对,再看了看时间确认了异步处理。
for (let i = 0, len = temp.length; i < len; i++) {
httpData.push(
new Promise((reslove, reject) => {
let cloudPath =
"postImage/" +
new Date().getTime() +
temp[i].match(/\.[^.]+?$/)[0];
wx.cloud.uploadFile({
cloudPath,
filePath: temp[i],
success: (res) => {
this.setData({
fileIDs: this.data.fileIDs.concat(res.fileID),
});
console.log(res.fileID);
reslove();
},
fail: (res) => {
console.log(res);
},
});
})
);
}
promise.all(httpData).then(){
}
递归上传方案:顺序正确,耗时增加
const upload = function (imgArr, i = 0) {
return new Promise((reslove, reject) => {
let fileIDs = [];
function uploadImg(imgArr, i) {
if (imgArr.length <= i) {
reslove(fileIDs);
return;
} else {
let cloudPath =
"postImage/" + new Date().getTime() + imgArr[i].match(/\.[^.]+?$/)[0];
wx.cloud.uploadFile({
cloudPath,
filePath: imgArr[i],
success: (res) => {
fileIDs.push(res.fileID);
uploadImg(imgArr, i + 1);
},
});
}
}
uploadImg(imgArr, i);
});
};
upload(temp).then(res=>{
})
- 递归方案之后获取的fileID顺序正确,处理时间也正确
这纯粹是代码写的烂,根本不用改方案。
fileIDs.concat 连接数组改为 fileIDs[i] 按索引赋值就行了。
就是在拼接cloudPath时,在第一张前加A,第二张加B…
后面返回的数组(乱序)再排序一下
最佳方案可能是 async await