下面的uploading函数为封装成Promise的上传表单的函数:
function uploading(type,opts,serverurl,callback) {
return new Promise(function (resolve,reject) {
var formdata = new FormData();
formdata.append(type,JSON.stringify(opts));
$.ajax({
type: 'post',
url: serverurl,
data: formdata,
cache : false,
processData : false, // 不处理发送的数据,因为data值是Formdata对象,不需要对数据做处理
contentType : false, // 不设置Content-type请求头
success: function (data,success) {
callback&&callback(JSON.parse(data));
console.log("look here")
console.log(data);
resolve(data)
},
error: function (err) {
reject(err);
alert("网络错误");
}
})
})
}
主要代码从下面开始:
与该问题相关的代码逻辑主要为:(chunksarrpromise为调用uploading函数生成的Promise对象生成的数组,Promise.all(chunksarrpromise).then(values) => {} ,等待所有的文件块处理完成后执行对应的操作,现在的问题是,上面的Promise.all(chunksarrpromise).then中的values输出一直为空数组,而里面的每一个promise执行完确实是有返回的。)
var chunksarrpromise = new Array();
for(let curindex = 0;curindex < chunks;curindex++) {
if(file.size-start <= chunkSize) {
end = file.size;
}else {
end = start + chunkSize;
}
//仅上传未上传的部分
if(!isinArray(alreadychunks,curindex)) {
let tempcell = {
data: null,
n: 0,
file_id: summary,
username: username,
length: 0
};
tempcell.length = end - start;
filder[curindex] = new FileReader();
filder[curindex].readAsText(file.slice(start, end),"gb2312");
filder[curindex].onload = function () {
tempcell.n = curindex;
tempcell.data = filder[curindex].result;
console.log(tempcell)
//chunk块上传
chunksarrpromise.push(uploading("chunks", tempcell, chunksurl));
}
}
start = end;
}
console.log(chunksarrpromise);
Promise.all(chunksarrpromise).then((values) => {
console.log("Promise %%%% all")
console.log(values);
}).catch(err => {
console.log(err);
})
代码执行结果如下:
(第一个look here是因为我上面还有个调用uploading的函数,真正的Promise.add是从Promise %%% all 开始的,可以看到它打出来的是[],而其Promise真正执行完后的data是mochen,也就是说Promise.all并未等其内部的Promise执行完就执行了,请问各位码友有碰到过吗?要怎么解决?)
代码地址: https://github.com/guangying1...
你的chunksarrpromise 是个空数组。。。,Promise.all就直接执行完了,因为你是通过异步函数往chunksarrpromise塞进去的