【发布时间】:2017-05-01 15:46:37
【问题描述】:
我有一个 Web 应用程序,它从 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>
Working JSFiddle with libs and examples included
它工作得很好。 JSZipUtils.getBinaryContent 返回一个带有来自 URL 的 zip 文件的二进制内容的承诺。 zip.loadAsync() 读取二进制内容并将其包含到存档中。 zip.generateAsync 在 RAM 中构建 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 文件的内容。
我对 Promisies 的工作方式不是很了解,所以我需要一个函数来接收 url 并等待 promise 解决,这样我就可以多次调用它以及常规的 zip.file 然后触发zip 一代。谢谢。
【问题讨论】:
-
你能说明你的目标是什么吗?您是否尝试使用
loadAsync读取多个 zip 文件并将它们合并到一个 zip 中? -
听起来你正试图让一个函数“等待”,直到一个承诺在它返回之前解决。你不能在 Javascript 中做到这一点。无法进行异步操作并以某种方式将其包装为返回异步结果的同步函数。那是做不到的。它经常被要求并且无法完成。相反,您必须学习如何编写正确的异步代码,在该代码中从函数返回一个 Promise,并在该 Promise 上使用
.then()以了解异步操作何时完成,然后只有在该.then()处理程序中启动序列中的下一步。 -
@nderscore 是的,这就是我想要做的。我们可能会假设我们不知道应该合并多少档案/用户可能会添加额外的档案。
-
另外,来自异步回调的
throw err不会做任何有用的事情。该错误可能会被默默地吃掉,并且没有机会在更高级别上catch该异常,因为它是从异步回调中抛出的。所以,基本上,永远不要在异步回调中使用throw err。 -
确保所有异步函数(包括
then回调!)return是一个承诺
标签: javascript jquery promise jszip