JSZip 在 IE11 中使用 Promise.all 加载多个文件
JSZip load multiple files with Promise.all in IE11
我们正在开发一种工具,供用户将 zip 包上传到我们公司的内部网站。我们正在使用 jszip 检查 zip 文件内部并确保符合某些政策和格式指南。
我们在 zip 中查找某些文件,可能有 0 到 3 个 xml 个我们特别感兴趣的文件。然后我们想展开这些文件并在它们全部加载后检查其中的一些内容.
我按照 this suggestion 了解如何做到这一点:
var zip = JSZipObject...
var promises = [];
var fileList = [file0,file1...fileX];
fileList.forEach(function(file){
promises.push(zip.file(file.name).async('string'));
});
return Promise.all(promises);
这在 Chrome 中效果很好,但在 IE there is no native Promise support 中效果很好。
不幸的是,我们公司的大部分人仍在使用 IE11,因此我需要想出一个同时适用于 Chrome 和 IE11 的解决方案。
我熟悉 jQuery 版本的 promises 并且对它们使用了类似的技巧来等待所有内容都已解决。
return $.when.apply(null,[promises]);
但这似乎不起作用,因为 zip.file().async()
返回的承诺不是 jQuery 承诺。
有没有一种方法可以将 JSZip promise 包装在 jQuery 中,或者我可以通过其他方式来处理这个问题?
您可以将 jszip promises 转换为 jQuery promises 使用类似这样的东西(我没有测试过,但您明白了):
function promiseToDeferred(p) {
var dfd = jQuery.Deferred()
p
.then(function(x) { dfd.resolve(x) })
.catch(function(err) { dfd.reject(err) })
return dfd.promise()
}
所以你的代码看起来像这样:
var fileList = [file0,file1...fileX]
var promises = fileList
.map(function(file) { return zip.file(file.name).async('string') })
.map(promiseToDeferred)
return jQuery.when.apply(null,[promises])
我们正在开发一种工具,供用户将 zip 包上传到我们公司的内部网站。我们正在使用 jszip 检查 zip 文件内部并确保符合某些政策和格式指南。
我们在 zip 中查找某些文件,可能有 0 到 3 个 xml 个我们特别感兴趣的文件。然后我们想展开这些文件并在它们全部加载后检查其中的一些内容.
我按照 this suggestion 了解如何做到这一点:
var zip = JSZipObject...
var promises = [];
var fileList = [file0,file1...fileX];
fileList.forEach(function(file){
promises.push(zip.file(file.name).async('string'));
});
return Promise.all(promises);
这在 Chrome 中效果很好,但在 IE there is no native Promise support 中效果很好。
不幸的是,我们公司的大部分人仍在使用 IE11,因此我需要想出一个同时适用于 Chrome 和 IE11 的解决方案。
我熟悉 jQuery 版本的 promises 并且对它们使用了类似的技巧来等待所有内容都已解决。
return $.when.apply(null,[promises]);
但这似乎不起作用,因为 zip.file().async()
返回的承诺不是 jQuery 承诺。
有没有一种方法可以将 JSZip promise 包装在 jQuery 中,或者我可以通过其他方式来处理这个问题?
您可以将 jszip promises 转换为 jQuery promises 使用类似这样的东西(我没有测试过,但您明白了):
function promiseToDeferred(p) {
var dfd = jQuery.Deferred()
p
.then(function(x) { dfd.resolve(x) })
.catch(function(err) { dfd.reject(err) })
return dfd.promise()
}
所以你的代码看起来像这样:
var fileList = [file0,file1...fileX]
var promises = fileList
.map(function(file) { return zip.file(file.name).async('string') })
.map(promiseToDeferred)
return jQuery.when.apply(null,[promises])