Javascript Can';t使用异步读取内部zip获取csv文件名及其内容
我试图编写一个函数,加载一个包含多个其他zip文件的zip文件,遍历这些文件并提取所有找到的csv文件,以合并并将结果提取到一个聚合的csv中。我遇到的问题是,我无法使用async将csv的内容映射到其文件名或目录。这里有一个代码段,其中myzip2是一个JSZIP对象,files是一个文件名字典,csvfiles是我的输出数组Javascript Can';t使用异步读取内部zip获取csv文件名及其内容,javascript,jquery,csv,jszip,Javascript,Jquery,Csv,Jszip,我试图编写一个函数,加载一个包含多个其他zip文件的zip文件,遍历这些文件并提取所有找到的csv文件,以合并并将结果提取到一个聚合的csv中。我遇到的问题是,我无法使用async将csv的内容映射到其文件名或目录。这里有一个代码段,其中myzip2是一个JSZIP对象,files是一个文件名字典,csvfiles是我的输出数组 for (var key in files) { if ( files[key].name.includes('.csv') ) {
for (var key in files) {
if ( files[key].name.includes('.csv') ) {
myzip2.file( files[key].name ).async("string").then( function(result) {
csvfiles.push( $.csv.toArrays(result) ); // contains the csv content
csvfiles.push( files[key].name ); // undefined in async
});
)
)
我想同时推送csv内容和文件名,但函数中未定义文件名。我怎样才能得到它?我没有太多机会在谷歌上搜索我的问题,我可能缺乏正确的措辞
谢谢
如果有人遇到同样的问题,那么将文件名与内容匹配是一个由箭头函数修复的闭包问题,但是匹配正确的zipfile名称是一个JSZip附加到当前对象的问题。如果需要清除旧的JSZip,请使用
newJSZIP()
完整代码,zipfiles是包含在mainzip中的zipfiles名称列表
var csvfiles=[]
对于(var i=0;i{
让subfiles=subzip.files;
Object.keys(子文件).forEach(文件名=>{
if(filename.includes('.csv')){
subzip.file(文件名).async(“字符串”)。然后(
readData=>{
var obj=$.csv.toObjects(readData);//效果很好
obj['csvfile']=文件名//正确的文件
obj['zipfile']=此ZipName;//zipfile不正确。。。
csvfiles.push(obj);
}
);
}
})
}
)
}console.log(csvfiles)
问题与文件
变量的词法范围有关。它与async
无关
闭包是捆绑在一起(封闭)的函数与其周围状态(词汇环境)的引用的组合。换句话说,闭包允许您从内部函数访问外部函数的作用域。在JavaScript中,每次创建函数时都会在函数创建时创建闭包
在循环中执行此操作时,需要注意“循环中的闭包”问题 请查看同一链接后面的“在循环中创建闭包:常见错误”:
您应该将匿名函数替换为箭头函数,这样它就可以工作了
for(var键入文件){
//将'files[key]`的值设置为单独的变量很重要。
//因为否则,`files`的最后一个元素将被捕获到表达式`files[key]`的闭包中。
常量文件名=文件[key]。名称;
myzip2
.file(文件名)
.async(“字符串”)
//箭头函数`result=>{}`创建一个从外部作用域捕获`fileName`变量的闭包
。然后(结果=>{
csvfiles.push($.csv.toArray(结果));
csvfiles.push(文件名);
});
}
谢谢!文件名不再是未定义的,但不知何故它与正确的文件名不匹配。我得到的文件名与结果中存储的内容无关(即使是非csv文件,即使此指令位于if语句if(files[key].name.includes('.csv'))
)。知道为什么不匹配吗?我觉得钥匙在这段时间内因为async@Philippe,您是否在循环中执行此操作?是的,有一个循环,它可能与(for(var key in files){if(files[key].name.includes('.csv')){myzip2.[…]
这绝对是相关的。请用循环更新您的问题,我将更新答案。这与循环和闭包有关。@Philippe,我更新了答案。检查解决方案。如果答案解决了您的问题,请接受并投票。