【发布时间】:2020-12-28 15:37:04
【问题描述】:
我正在下载带有 zip 文件夹的文件,但它会先下载 zip 文件夹,然后再将文件添加到 zip 文件夹对象中。如果我删除它们并从“this.UrlToPromise()”的调用中捕获块,它可以正常工作,但是当它面临来自“this.UrlToPromise()”的拒绝时,它不能正常工作。
var zip = new JSZip();
zip = this.makezip(files, zip);
zip.generateAsync({ type: "blob" }).then(function (content) {
if (downloadName) {
console.log('zip download one', zip);
FileSaver.saveAs(content, downloadName + '.zip');
} else {
FileSaver.saveAs(content, 'All.zip');
}
});
async makezip(files, zip, folderName = null) {
if (folderName)
var tempFolder = zip.folder(folderName);
for (var i in files) {
files[i].hasOwnProperty('file_title')
if (!Array.isArray(files[i])) {
if (typeof files[i]['file_title'] !== 'undefined' && typeof files[i]['file_path'] !== 'undefined') {
await this.urlToPromise(files[i]['file_path']).then(response=>{
if (!folderName)
zip.file(files[i]['file_title'] + '.' + returnExtFromImage(files[i]['file_path']), response, { base64: true, binary: true });
else
tempFolder.file(files[i]['file_title'] + '.' + returnExtFromImage(files[i]['file_path']), response, { base64: true, binary: true });
})
}
} else if (Array.isArray(files[i])) {
zip = this.makezip(files[i], zip, i);
}
}
return zip;
}
urlToPromise(url) {
return new Promise(function (resolve, reject) {
JSZipUtils.getBinaryContent(url, function (err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
【问题讨论】:
-
异常处理并不是真正的问题,而是您没有等待该循环中的任何承诺。
-
是的,你是对的,这就是问题所在,但我应用了不同的代码,但没有工作,你能分享示例代码吗?
-
您尝试了哪些代码?异步循环通常需要
await或Promise.all。 -
我已经使用 awaita 和 async 更新了代码,现在它会生成错误“zip.generateAsync 不是函数”
-
makezip现在正在返回一个承诺
标签: javascript reactjs promise