Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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 等待所有文件更新,然后下载它们_Javascript_Performance_Asynchronous_Jszip - Fatal编程技术网

Javascript 等待所有文件更新,然后下载它们

Javascript 等待所有文件更新,然后下载它们,javascript,performance,asynchronous,jszip,Javascript,Performance,Asynchronous,Jszip,我正在使用库JSZip创建.png文件,并将它们添加到要下载的zip存档中。当我添加太多大文件时,问题就出现了 我使用一组for循环将文件添加到zip,然后激活自动下载。问题似乎是下载在文件更新之前就开始了,因此最终没有数据 for (var row = 0; row < 3; row++) { // Loop for rows for (var col = 0; col < 3; col++) { // Loop for cols if (cropSrc[row][co

我正在使用库JSZip创建.png文件,并将它们添加到要下载的zip存档中。当我添加太多大文件时,问题就出现了

我使用一组for循环将文件添加到zip,然后激活自动下载。问题似乎是下载在文件更新之前就开始了,因此最终没有数据

for (var row = 0; row < 3; row++) { // Loop for rows
  for (var col = 0; col < 3; col++) { // Loop for cols
    if (cropSrc[row][col]) { // If data for cropped img exists
      var fileName = row + "" + col + ".png";
      zip.file(fileName, cropSrc[row][col].src, {
        base64: true
      }); // Add file to zip

      zip.file(fileName).async("uint8array").then(function(u8) { // Once file is complete... I think
        console.log("done");
      });

    }
  }
}

// Download zip file
zip.generateAsync({
  type: "base64"
}).then(function(base64) {
  window.location = "data:application/zip;base64," + base64;
});
for(var row=0;row<3;row++){//Loop for rows
对于(var col=0;col<3;col++){//cols循环
if(cropSrc[row][col]){//if裁剪的img数据存在
var fileName=row+“”+col+“.png”;
zip.file(文件名,cropSrc[row][col].src{
base64:对
});//将文件添加到zip
zip.file(fileName.async(“uint8array”)。然后(函数(u8){//一旦文件完成……我想
控制台日志(“完成”);
});
}
}
}
//下载zip文件
zip.generateAsync({
类型:“base64”
}).then(函数(base64){
window.location=“数据:应用程序/zip;base64,”+base64;
});
我必须确保在下载之前等待所有文件都已更新,我将如何使用异步函数实现这一点

这是


不确定这是否有帮助,但下面是完整代码的更完整视图,我正在使用SAPUI5并在SAP Web IDE中开发:

var cropSrc = {
    0: {
        0:{src:"base64 data placeholder"},
        1:{src:"base64 data placeholder"},
        2:{src:"base64 data placeholder"}
    },
    1: {
        0:{src:"base64 data placeholder"},
        1:{src:"base64 data placeholder"},
        2:{src:"base64 data placeholder"}
    },
    2: {
        0:{src:"base64 data placeholder"},
        1:{src:"base64 data placeholder"},
        2:{src:"base64 data placeholder"}
    }
};

sap.ui.define([
    "sap/ui/core/mvc/Controller",
    "SAP_SARAH_ML_Project/libs/jszip", // Enables the jszip library (imports)
], function(Controller, jszipjs) { // Second part of importing
    "use strict";
    return Controller.extend("SAP_SARAH_ML_Project.controller.View1", {

        zipImg: function() {
            for (var row = 0; row < 3; row++) { // Loop for rows
                for (var col = 0; col < 3; col++) { // Loop for cols
                    if (cropSrc[row][col]) { // If data for cropped img exists
                        var fileName = row + "" + col + ".png";
                        zip.file(fileName, cropSrc[row][col].src, {
                            base64: true
                        }); // Add file to zip

                        zip.file(fileName).async("uint8array").then(function(u8) { // Once file is complete... I think
                            console.log("done");
                        });

                    }
                }
            }

            // Download zip file
            zip.generateAsync({
                type: "base64"
            }).then(function(base64) {
                window.location = "data:application/zip;base64," + base64;
            });
        }
    });
});
var cropSrc={
0: {
0:{src:“base64数据占位符”},
1:{src:“base64数据占位符”},
2:{src:“base64数据占位符”}
},
1: {
0:{src:“base64数据占位符”},
1:{src:“base64数据占位符”},
2:{src:“base64数据占位符”}
},
2: {
0:{src:“base64数据占位符”},
1:{src:“base64数据占位符”},
2:{src:“base64数据占位符”}
}
};
sap.ui.define([
“sap/ui/core/mvc/Controller”,
“SAP_SARAH_ML_Project/libs/jszip”//启用jszip库(导入)
],函数(Controller,jszipjs){//导入的第二部分
“严格使用”;
返回Controller.extend(“SAP\u SARAH\u ML\u Project.Controller.View1”{
zipImg:function(){
对于(var row=0;row<3;row++){//行循环
对于(var col=0;col<3;col++){//cols循环
if(cropSrc[row][col]){//if裁剪的img数据存在
var fileName=row+“”+col+“.png”;
zip.file(文件名,cropSrc[row][col].src{
base64:对
});//将文件添加到zip
zip.file(fileName.async(“uint8array”)。然后(函数(u8){//一旦文件完成……我想
控制台日志(“完成”);
});
}
}
}
//下载zip文件
zip.generateAsync({
类型:“base64”
}).then(函数(base64){
window.location=“数据:应用程序/zip;base64,”+base64;
});
}
});
});

您可以使用Promise.all来实现此目的:

let arr = [addFilePromise('file1'),addFilePromise('file2'),addFilePromise('file3')]
Promise.all(arr).then(zip.generateAsync({type:"base64"}))
编辑:

让fileAddActions=[];
让addFilePromise=函数(文件名){
zip.file(文件名,cropSrc[row][col].src{
base64:对
}); 
返回zip.file(fileName.async(“uint8array”)
}
对于(var row=0;row<3;row++){//行循环
对于(var col=0;col<3;col++){//cols循环
if(cropSrc[row][col]){//if裁剪的img数据存在
var fileName=row+“”+col+“.png”;
fileAddActions.push(addFilePromise(文件名))
}
}
}
Promise.all(fileAddActions).then(zip.generateAsync({type:“base64”})).then(base64=>{
indow.location=“数据:应用程序/zip;base64,”+base64;
})
类似这样的东西应该会起作用,我也推荐这篇文章:
由于async返回一个承诺,因此可以将执行for循环的函数设置为async/await函数

async functionName() {
   for loop...
      let res = await zip.file(fileName).async("uint8array");
}
参考这个


它使用了一种称为parallelimit的东西,作为一个信号量,以有限的数量异步处理文件,然后将其压缩。

感谢您的快速响应。我是异步新手,addFilePromise是什么?你能不能把它格式化成我的函数的格式?我真的很感激谢谢你@void先生我试过几次,但我不知道它是否真的在等待承诺的完成。我尝试在chrome中调试,但一旦调用了promise.all,我就无法访问阵列以检查承诺是否真的完整或zip是否正确。(顺便说一句,你漏掉了一个“w”)我真的很感谢你的帮助。当我运行它时,它仍然会使浏览器进入“about:blank”,并且不会下载任何内容。不确定问题是什么。您使用的是哪个库?我将尝试制作一个更完整的示例我正在使用我也在使用SAP Web IDE在SAPUI5中开发我更新了这个问题,以更全面地查看我的代码。谢谢你的帮助!我在问题中添加了更完整的代码版本。SAPUI5似乎具有作为对象一部分的功能,所以我不知道如何在其中实现这一点。也许你可以解释一下。非常感谢。
async functionName() {
   for loop...
      let res = await zip.file(fileName).async("uint8array");
}