JavaScript如何使forEach循环同步

时间:2018-02-07 10:29:41

标签: javascript node.js zip

在我的项目中,我需要解压缩文件并将其内容上传到nodeJS服务器。我能够解压缩文件,例如我得到了内容的文件名等。 解压后我想将内容上传到我的服务器。这就是问题所在。我正在使用formData来传输文件。但每次我尝试上传文件时,它都会在firefox中显示控制台上的错误:

“TypeError:FormData.append的参数2没有实现接口Blob。”

所以似乎没有给formData提供文件对象...... 对于解压缩,我使用JSZip [链接到JSZip] [1]

修改

我自己想出了第一个问题。现在我无法按正确的顺序执行代码。我的JS代码:

$("#file").on("change", function (evt) {
    var formData = new FormData();
    var counter = 0;
    // remove content
    $result.html("");
    // be sure to show the results
    $("#result_block").removeClass("hidden").addClass("show");
    // Closure to capture the file information.

    console.log('1');
    function handleFile(f) {
        var $fileContent = $("<ul>");
        $result.append($fileContent);           
            JSZip.loadAsync(f)
                .then(function (zip) {
                    zip.forEach(function (relativePath, zipEntry) {
                        console.log('2');                        
                        console.log(zipEntry);
                        zip.file(zipEntry.name).async("blob").then(function (u8) {
                            console.log('3');  
                            console.log(u8);
                            formData.append('photo', u8, counter);
                            counter++;
                            $fileContent.append($("<li>", {
                                text: zipEntry.name
                            }));
                        })                         
                    });
                }, function (e) {
                    $result.append($("<div>", {
                        "class": "alert alert-danger",
                        text: "Error reading " + f.name + ": " + e.message
                    }));
                });
        }           


    var files = evt.target.files;
    handleFile(files[0]);
});

控制台输出是:

1
2
object
2
object
3
blob
3
blob

但我想要的是:

1
2
object
3
blob
2
object
3
blob

但是我不知道如何把另一个。然后按照我想要的方式进行这项工作

0 个答案:

没有答案