JSZip使用Promise.all在IE11中加载多个文件

时间:2018-10-24 21:32:52

标签: javascript jquery promise internet-explorer-11 jszip

我们正在开发一种工具,供用户将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中,或者可以以其他方式处理此问题?

1 个答案:

答案 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])