第一组文件上传成功,但一旦完成,它就不会启动队列中的下一组文件。
为什么迭代在第一组后停止,如何解决此问题?
该解决方案不一定必须使用Bluebird - 我首先使用它,因为我认为,我会变得更容易。
function uploadFile(url, file, onProgress) {
return new Promise((resolve, reject) => {
const formData = new FormData();
formData.append('file', file);
const xhr = new XMLHttpRequest();
xhr.open('POST', url);
xhr.addEventListener('readyState', _ => {
if (xhr.readyState === xhr.DONE) {
resolve(file);
}
});
xhr.addEventListener('error', _ => {
reject(new Error());
});
xhr.upload.addEventListener('progress', event => {
onProgress && onProgress(event.loaded / event.total);
});
xhr.send(formData);
});
}
/* files is a FileList */
Promise.map(Array.from(files), file => {
return uploadFile(location.href, file, null);
}, { concurrency: 2 });
事件类型称为 readystatechange
(不是 readyState
(。
正如powerc9000在评论中注意到的那样,Promise没有得到解决,Promise.map不知道何时继续。