JSZip загружает несколько файлов с Promise.all в IE11 - PullRequest
0 голосов
/ 25 октября 2018

Мы разрабатываем инструмент для загрузки пользователями zip-пакетов на сайт внутренней сети в нашей компании.Мы используем jszip , чтобы проверить внутри zip-файлов и убедиться, что они соответствуют определенным правилам политики и формата.

Мы ищем определенные файлы внутри zip-файла, и может быть от 0 до 3 xmlфайлы, которые нас особенно интересуют. Затем мы хотим расширить эти файлы и проверить их содержимое после загрузки.

Я следовал этому предложению , как это сделать:

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 нет встроенной поддержки Promise .

К сожалению, большая часть нашей компании все еще использует IE11, поэтому мне нужноПридумайте решение, которое будет работать как в Chrome, так и в IE11.

Я знаком с версиями обещаний в jQuery и использовал аналогичный прием для ожидания решения всех проблем.

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

Но, похоже, это не сработает, потому что обещания, возвращаемые zip.file().async(), не являются обещаниями jQuery.

Есть ли способ, которым я могу обернуть обещания JSZip в jQuery или что-то другое?И как мне с этим справиться?

1 Ответ

0 голосов
/ 25 октября 2018

Вы можете преобразовать обещания 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])
...