使用 Promise.map 排队文件上传
Queueing file uploads with Promise.map
第一组文件上传成功,但是刚上传完,并没有开始队列中的下一组文件。
为什么迭代在第一次设置后停止,我该如何解决这个问题?
解决方案不一定非得用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 不知道什么时候继续。
第一组文件上传成功,但是刚上传完,并没有开始队列中的下一组文件。
为什么迭代在第一次设置后停止,我该如何解决这个问题?
解决方案不一定非得用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 不知道什么时候继续。