Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';t使用异步读取内部zip获取csv文件名及其内容_Javascript_Jquery_Csv_Jszip - Fatal编程技术网

Javascript Can';t使用异步读取内部zip获取csv文件名及其内容

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') ) {

我试图编写一个函数,加载一个包含多个其他zip文件的zip文件,遍历这些文件并提取所有找到的csv文件,以合并并将结果提取到一个聚合的csv中。我遇到的问题是,我无法使用async将csv的内容映射到其文件名或目录。这里有一个代码段,其中myzip2是一个JSZIP对象,files是一个文件名字典,csvfiles是我的输出数组

    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,我更新了答案。检查解决方案。如果答案解决了您的问题,请接受并投票。