我们正在开发一种工具,供用户将zip包上传到我们公司的Intranet网站。我们正在使用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上都可以使用的解决方案。
我熟悉Promise的jQuery版本,并且对它们使用了类似的技巧,直到所有问题都解决为止。
return $.when.apply(null,[promises]);
但这似乎不起作用,因为zip.file().async()
返回的诺言不是jQuery诺言。
有没有一种方法可以将JSZip promises包装在jQuery中,或者可以以其他方式处理此问题?
答案 0 :(得分:1)
您可以使用类似以下内容将jszip承诺转换为jQuery承诺(我尚未测试过,但您知道了):
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])