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

标签 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 的解决方案。

我熟悉 jQuery 版本的 Promise,并且对它们使用了类似的技巧来等待所有问题都得到解决。

return $.when.apply(null,[promises]);

但这似乎不起作用,因为 zip.file().async() 返回的 promise 不是 jQuery promise 。

有没有一种方法可以将 JSZip promise 封装在 jQuery 中,或者可以用其他方式来处理这个问题?

最佳答案

您可以使用类似的方法将 jszip promise 转换为 jQuery promise (我还没有测试过,但您明白了):

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

关于javascript - JSZip 在 IE11 中使用 Promise.all 加载多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52978200/

相关文章:

javascript - 异步失败时更喜欢抛出或拒绝

javascript - 理解JavaScript中的async和await

javascript - 在 codeigniter 的数据表中弹出框

IE10 中的 Javascript 日期选择器问题

php - 如何检测浏览器/选项卡是否关闭

javascript - 将图像动态渲染到 DOM 中。毛刺效应

javascript - webpack 不加载依赖项

c# - C# 中的 $(selector).text() 等效项(修订版)

php - 如何打破挂起的ajax调用并加载另一个页面

javascript - promise 是如何创建的?