在zip内部读取异步内容时,无法同时获取csv的文件名及其内容

菲利普

我正在尝试编写一个函数,该函数加载包含多个其他zip文件的zip文件,对其进行迭代,然后提取找到的所有csv文件以合并并将结果提取到一个聚合的csv中。我遇到的问题是我无法使用异步将csv的内容映射到其文件名或目录。这是一个片段,其中myzip2是JSZIP对象,文件是文件名的字典,而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追加到当前对象的问题。new JSZip()如果您需要清除旧的,请使用

完整代码zipfiles是mainzip中包含的zipfiles名称列表

var csvfiles = []
for (var i = 0; i < zipfiles.length; i++) {

    let thiszipname = zipfiles[i];
    let thiszip = mainzip.file( thiszipname ).async("blob");

    var newzip = new JSZip();
    newzip.loadAsync( thiszip ).then(
        subzip => {
            let subfiles = subzip.files;
            Object.keys(subfiles).forEach( filename => {

                if ( filename.includes('.csv') ) {
                    subzip.file( filename ).async("string").then(
                        readData => {
                            var obj = $.csv.toObjects(readData); // works great
                            obj['csvfile'] = filename            // correct file
                            obj['zipfile'] = thiszipname;        // incorrect zipfile...
                            csvfiles.push( obj );
                        }
                    );
                }
            })

        }
    )
} console.log(csvfiles)
弗拉基米尔·塞里克(Vladimir Serykh)

问题与files变量的词法范围有关与无关async

闭包是捆绑在一起(封闭)的函数及其周围状态(词汇环境)的组合。换句话说,闭包使您可以从内部函数访问外部函数的范围。在JavaScript中,每次创建函数时都会在函数创建时创建闭包。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures


在循环中执行此操作时,需要注意“循环闭合”问题。

在同一链接下查看“在循环中创建闭包:常见错误”部分:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Closures


您应该将匿名函数替换为箭头函数,它将起作用。

for (var key in files) {
    // It's important to set the value of the `files[key]` to the separate variable.
    // Because otherwise the last element of the `files` will be captured in the closure for the expression `files[key]`.
    const fileName = files[key].name;
    myzip2
        .file(fileName)
        .async("string")
        // Arrow function `result => {}` creates a closure that captures `fileName` variable from the external scope
        .then(result => {
            csvfiles.push($.csv.toArrays(result));
            csvfiles.push(fileName);
        });
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

完美地在python中获取所有javascript文件名及其内容

来自分类Dev

如何创建一个显示文件名及其内容的日志文件

来自分类Dev

Bash命令以查找通用文件名并显示其内容

来自分类Dev

Bash命令以查找通用文件名并显示其内容

来自分类Dev

从内容处置获取文件名

来自分类Dev

删除文件夹及其内容

来自分类Dev

为什么要同时等待异步请求和其内容的读取?

来自分类Dev

为什么要同时等待异步请求和其内容的读取?

来自分类Dev

将目录及其内容归档到zip归档文件中

来自分类Dev

递归地更改文件及其内部所有内容的权限

来自分类Dev

Azure 文件存储 - 列出目录内容 - 读取文件名

来自分类Dev

使用FtpWebRequest下载文件时获取文件名而不是内容

来自分类Dev

使用FtpWebRequest下载文件时获取文件名而不是内容

来自分类Dev

读取Excel文件而不更改其内容

来自分类Dev

无法在Windows 10上访问文件夹及其内容“访问被拒绝”

来自分类Dev

是否可以在 Node 中读取文件并导出其内容(不异步导出)?

来自分类Dev

如何使用PowerShell中的文件内容获取文件名

来自分类Dev

使用htmldocument / HtmlAgilityPack获取所有节点及其内容

来自分类Dev

无法初始化向量的大小及其内容

来自分类Dev

无法设置 h1 标签及其内容的样式

来自分类Dev

如何在悬停时扩展div及其内容?

来自分类Dev

React Native-从Android内容uri获取文件名

来自分类Dev

比较两个文件列表及其内容

来自分类Dev

Java-删除文件夹及其内容

来自分类Dev

比较两个文件列表及其内容

来自分类Dev

列出文件夹及其内容

来自分类Dev

路由整个文件夹及其内容

来自分类Dev

如何从 XML 文件中删除元素及其内容

来自分类Dev

regexp与内容匹配时检索文件名

Related 相关文章

  1. 1

    完美地在python中获取所有javascript文件名及其内容

  2. 2

    如何创建一个显示文件名及其内容的日志文件

  3. 3

    Bash命令以查找通用文件名并显示其内容

  4. 4

    Bash命令以查找通用文件名并显示其内容

  5. 5

    从内容处置获取文件名

  6. 6

    删除文件夹及其内容

  7. 7

    为什么要同时等待异步请求和其内容的读取?

  8. 8

    为什么要同时等待异步请求和其内容的读取?

  9. 9

    将目录及其内容归档到zip归档文件中

  10. 10

    递归地更改文件及其内部所有内容的权限

  11. 11

    Azure 文件存储 - 列出目录内容 - 读取文件名

  12. 12

    使用FtpWebRequest下载文件时获取文件名而不是内容

  13. 13

    使用FtpWebRequest下载文件时获取文件名而不是内容

  14. 14

    读取Excel文件而不更改其内容

  15. 15

    无法在Windows 10上访问文件夹及其内容“访问被拒绝”

  16. 16

    是否可以在 Node 中读取文件并导出其内容(不异步导出)?

  17. 17

    如何使用PowerShell中的文件内容获取文件名

  18. 18

    使用htmldocument / HtmlAgilityPack获取所有节点及其内容

  19. 19

    无法初始化向量的大小及其内容

  20. 20

    无法设置 h1 标签及其内容的样式

  21. 21

    如何在悬停时扩展div及其内容?

  22. 22

    React Native-从Android内容uri获取文件名

  23. 23

    比较两个文件列表及其内容

  24. 24

    Java-删除文件夹及其内容

  25. 25

    比较两个文件列表及其内容

  26. 26

    列出文件夹及其内容

  27. 27

    路由整个文件夹及其内容

  28. 28

    如何从 XML 文件中删除元素及其内容

  29. 29

    regexp与内容匹配时检索文件名

热门标签

归档