首页 > 解决方案 > 在循环中从异步函数获取数据

问题描述

我正在使用 JSZip 访问 zip 中的文件。在那个 .zip 中有一个我正在寻找的文件,我需要它的内容。要获取内容,它似乎需要一个异步函数。在 for 循环中被多次调用。

我的问题是,当我找到正确的文件时,我处于异步函数中,因此试图从主程序中获取值告诉我“未定义”。但是我不能在那个异步函数中继续我的代码,因为它是在循环中调用的,所以我会多次运行我的主程序。

var fileToFind;

JSZip.forEach(function (relativePath, file){
    
    var fileAsStr = JSZip.file(relativePath).async("string"); //this is the way to get file content in JSZip
    
    const waitStr = async () => {
        fileAsStr = await fileAsStr;
        const anchorStr = "Some string which is in only one file";
        if(fileAsStr.indexOf(anchorStr) != -1){
            fileToFind = fileAsStr;
            console.log(fileToFind); //works ok
        }
    waitStr();
});

... //lot of stuff

console.log(fileToFind); //undefined

标签: javascriptasync-awaitjszip

解决方案


为什么要在循环中定义一个函数?相反,您可以已经定义函数并在循环中调用。

var fileToFind;

const waitStr = async (fileAsStr) => {
    fileAsStr = await fileAsStr;
    const anchorStr = "Some string which is in only one file";
    if(fileAsStr.indexOf(anchorStr) != -1) {
        fileToFind = fileAsStr;
        console.log(fileToFind); //works ok
    }
}

JSZip.forEach(function (relativePath, file) {
    
    var fileAsStr = JSZip.file(relativePath).async("string");
    waitStr(fileAsStr);
});
// ...

推荐阅读