У меня есть веб-приложение, которое собирает различные файлы с URL-адресов и объединяет их в zip-архив.
Я использую JSZip для работы с zip-файлами. Вот пример кода, который включает содержимое другого zip-архива, расположенного на том же сервере:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script type="text/javascript" src="./js/jszip.js"></script>
<script type="text/javascript" src="./js/jszip-utils.js"></script>
<script type="text/javascript" src="./js/FileSaver.js"></script>
Downloading archive with contents from another archive
<script>
jQuery(function($) {
var zip = new JSZip();
zip.file('see.txt','Regular files are being included with a single function call');
function flash(){
JSZipUtils.getBinaryContent('/version.zip', function(err, data) {
try {
zip.loadAsync(data)
.then(function(zip) {
zip.generateAsync({type: 'blob'},
function(metadata) {
})
.then(function(blob) {
saveAs(blob, 'result.zip');
}, function(e) {
showError(e);
});
})
.then(function success() {
});
} catch(e) {console.log(e)}
});
};
flash();
return false;
});
</script>
Работа с JSFiddle с включенными библиотеками и примерами
Это работает просто отлично. JSZipUtils.getBinaryContent
возвращает обещание с двоичным содержимым zip-файла из URL-адреса. zip.loadAsync()
читает бинарное содержимое и включает его в архив. zip.generateAsync
создает представление zip-архива в оперативной памяти, чтобы мы могли загрузить его позже.
Однако мне нужно обернуть zip.loadAsync()
в функцию, которую я могу вызывать несколько раз. Я пробовал что-то вроде этого:
function zipmerge(source){
JSZipUtils.getBinaryContent(source, function (err, data) {
if(err) {
throw err; // or handle the error
}
var zip = new JSZip();
zip.loadAsync(data);
});
};
Но похоже, что zip.loadAsync()
нужно подождать, чтобы завершиться. Если я просто запущу приведенную выше функцию, а затем сгенерирую zip-файл, он просто проигнорирует содержимое zip-файла, который я пытаюсь добавить.
Я не очень хорошо разбираюсь в том, как работают обещания, поэтому мне нужна помощь с функцией, которая будет получать URL-адрес и ждать разрешения обещания, чтобы я мог вызывать его несколько раз вместе с обычным zip.file
, а затем запускать генерацию zip. Спасибо.
loadAsync
и объединить их в один zip? - person nderscore   schedule 01.05.2017.then()
в этом обещании, чтобы узнать, когда асинхронная операция выполнена, а затем и только тогда внутри этого обработчика.then()
вы инициируете следующий шаг в ваша последовательность. - person jfriend00   schedule 01.05.2017throw err
из асинхронного обратного вызова не сделает ничего полезного. Ошибка, скорее всего, будет просто молча съедена, и нет возможностиcatch
этого исключения на более высоком уровне, потому что оно вызвано асинхронным обратным вызовом. Так что, по сути, никогда не делайтеthrow err
из асинхронного обратного вызова. - person jfriend00   schedule 01.05.2017then
обратные вызовы!)return
обещания - person Bergi   schedule 01.05.2017