【问题标题】:Returning results from FileReader()? [duplicate]从 FileReader() 返回结果? [复制]
【发布时间】:2020-10-15 05:47:10
【问题描述】:

我正在尝试制作一个简单的 csv 到 JSON 转换器(只是为了练习),但我还没有找到任何方法来从 FileReader() 函数中获取数据并返回。我不知道这是否可能。

那么下面的代码做了什么:它只是抓取一个 csv 文件,并在按下按钮后尝试运行一个将其转换为数组的函数(到目前为止)。打印数组的是console.log,它可以正常工作,但是如果我想返回这个数组以便可以将它传递给另一个函数怎么办?每当我使用 return csvArray; 然后而不是运行试图 console.log(fileToArray(fileinput)); 的函数时,我得到未定义。我没有在网上找到任何关于这个使用香草 JS 的内容。

const fileinput = document.querySelector("#csvfile").files[0];
const convertBtnFile = document.querySelector("#convertBtn");

convertBtnFile.addEventListener("click", (e) => {
  e.preventDefault();
  fileToArray(fileinput);
});

const fileToArray = (csvFile) => {
  const myFile = new FileReader();
  myFile.onload = (event) => {
    const wholeText = event.target.result;
    const splitLines = wholeText.split(/\r\n|\n/);
    csvArray = splitLines.map(i => i.split(","));
    console.log(csvArray);
  }
  myFile.readAsText(csvFile);
}
<input type="file" id="csvfile" /><br/> <button type="button" id="convertBtn">Convert</button>

【问题讨论】:

  • how the heck I should know that FilreRead() is async - 好吧,文档的第一行是:FileReader 对象让 Web 应用程序异步读取文件的内容 .. .. 1. Which part of your 5000 word general answer - 适用于您的代码的部分 .... 3. Guys like you make StackOverflow not a friendly place for novice programmers. - 您已经成为会员 7 年了...所以,您不是新手:p
  • 你的函数 fileToArray 不能返回内容,但是,通过添加一个回调参数,你可以调用一个你调用 console.log(csvArray); 的函数 - 这就是内容可用
  • const fileinput = document.querySelector("#csvfile").files[0] 为时过早。你需要const fileinput = document.querySelector("#csvfile");然后点击使用fileinput.files[0]
  • @JaromandaX,我知道。该问题已关闭是有原因的,并且 SO 的政策没有理由重新发布相同的问题。这应该关闭并删除。如果 OP 认为重复项没有回答他们的问题,他们可以改进他们的第一个问题

标签: javascript filereader


【解决方案1】:

你的代码做错的一件事是

const fileinput = document.querySelector("#csvfile").files[0];

马上 - 您想等到进入点击处理程序后再尝试读取文件

对您来说最简单的答案是在fileToArray 函数中使用回调

const convertBtnFile = document.querySelector("#convertBtn");

convertBtnFile.addEventListener("click", (e) => {
    e.preventDefault();
    const fileinput = document.querySelector("#csvfile").files[0];
    fileToArray(fileinput, data => {
        // do things with results here *********
    });
});

const fileToArray = (csvFile, cb) => { // ********
    const myFile = new FileReader();
    myFile.onload = (event) => {
        const wholeText = event.target.result;
        const splitLines = wholeText.split(/\r\n|\n/);
        csvArray = splitLines.map(i => i.split(","));
        cb(csvArray); // **** call the supplied function with the results
    }
    myFile.readAsText(csvFile);
}

如果您对 async/await 感到满意,您可以这样做 - 好处是,它“看起来”是同步的

const convertBtnFile = document.querySelector("#convertBtn");

//                                 note: vvvvv async
convertBtnFile.addEventListener("click", async (e) => {
    e.preventDefault();
    const fileinput = document.querySelector("#csvfile").files[0];
    const data = await fileToArray(fileinput);
    // do things here
});

const fileToArray = csvFile => {
    return new Promise((resolve, reject) => {
        const myFile = new FileReader();
        myFile.onload = event => {
            const wholeText = event.target.result;
            const splitLines = wholeText.split(/\r\n|\n/);
            csvArray = splitLines.map(i => i.split(","));
            resolve(csvArray);
        }
        myFile.onerror = reject;
        myFile.readAsText(csvFile);
    });
};

【讨论】:

  • 顺便说一句,你是 JS 金徽章持有者。如果您认为原件被错误关闭,您可以单手重新打开并回答,关闭/删除投票,而不是鼓励重新发布问题,这真的很糟糕
  • 我不知道我能做到这一点@Vega
  • @JaromandaX 据我所知,使函数异步的是 .onload 方法。在异步函数中返回的方式是回调,它的工作方式与返回类似。我得到正确了吗?另外,为什么你在第二种方式中使用承诺?不认为异步 .onload 方法无论如何都会返回一个承诺吗?
  • 不,异步一直是 javascript 的一部分,Promises 是一种相对较新的处理异步的方式 - Promises 的主要声名是通过允许您链接来克服回调地狱/末日金字塔异步任务而不是嵌套它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多