简体   繁体   English

FileReader readAsText()异步问题?

[英]FileReader readAsText() async issues?

I have implemented the following code to parse a CSV via a <input type="file" /> selection: 我已经实现了以下代码来通过<input type="file" />选择来解析CSV:

export async function parse(file: File) {
  let content = '';
  const reader = new FileReader();
  reader.onload = function(e: any) {
    content = e.target.result;
  };
  await reader.readAsText(file);
  const result = content.split(/\r\n|\n/);
  return result;
}

If I run this code and put a breakpoint on the line where I declare result , it retrieves the contents of the file successfully. 如果我运行此代码并在我声明result的行上放置一个断点,它会成功检索文件的内容。 If I do not put any breakpoint, the content is empty. 如果我没有放置任何断点,则内容为空。 As you can see, I added await to the line where the reader reads the file as text, but it's still not working. 正如您所看到的,我添加了await读者将文件作为文本读取的行,但它仍然无效。

await doesn't help here. await在这里没有帮助。 readAsText() doesn't return a Promise . readAsText()不返回Promise

You need to wrap the whole process in a Promise : 您需要将整个过程包装在Promise

export function parse(file: File) {
  // Always return a Promise
  return new Promise((resolve, reject) => {
    let content = '';
    const reader = new FileReader();
    // Wait till complete
    reader.onloadend = function(e: any) {
      content = e.target.result;
      const result = content.split(/\r\n|\n/);
      resolve(result);
    };
    // Make sure to handle error states
    reader.onerror = function(e: any) {
      reject(e);
    };
    reader.readAsText(file);
  });
}

Here is the JSBin I have tried and it work like a charm. 这是我尝试的JSBin ,它的工作就像一个魅力。

function parse(file) {
  const reader = new FileReader();
  reader.readAsText(file);
  reader.onload = function(event) {
    // The file's text will be printed here
  console.log(reader.result)
  }
}

Updated: 更新:

I write you a Promise version. 我给你写了一个Promise版本。

async function parse(file) {
  const reader = new FileReader();
  reader.readAsText(file);
  const result = await new Promise((resolve, reject) => {
    reader.onload = function(event) {
    resolve(reader.result)
    }
  })
  console.log(result)
}

To generalize @zero298's answer a tiny bit, here's the generic Promise-based wrapper around FileReader - 为了概括@ zero298的答案,这里是FileReader的基于Promise的通用包装 -

// get contents of a file as obtained from an html input type=file element
function getFileContents(file) {
  return new Promise((resolve, reject) => {
    let contents = ""
    const reader = new FileReader()
    reader.onloadend = function (e) {
      contents = e.target.result
      resolve(contents)
    }
    reader.onerror = function (e) {
      reject(e)
    }
    reader.readAsText(file)
  })
}

used like so - 像这样使用 -

async function parse(file) {
  const contents = await getFileContents(file)
  const result = contents.split(/\r\n|\n/)
  return result
}

or in the general case, 或者在一般情况下,

async function show(file) {
  const contents = await getFileContents(file)
  alert(contents)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 将 FileReader ReadAsBinaryString() 迁移到 ReadAsArrayBuffer() 或 ReadAsText() - Migrate FileReader ReadAsBinaryString() to ReadAsArrayBuffer() or ReadAsText() 使用FileReader在readAsBinaryString和readAsText之间的区别 - Difference between readAsBinaryString and readAsText using FileReader Phonegap FileReader readAsText返回null,但readAsDataURL起作用 - Phonegap FileReader readAsText returns null but readAsDataURL works JavaScript FileReader中的readAsDataURL()和readAsArrayBuffer()以及readAsText()之间的区别 - Difference between readAsDataURL() and readAsArrayBuffer() and readAsText() in JavaScript FileReader 无法在&#39;FileReader&#39;上执行&#39;readAsText&#39;:参数1不是&#39;Blob&#39;类型 - failed to execute 'readAsText' on 'FileReader' :parameter 1 is not of type 'Blob' fileReader.readAsText()JavaScript:未显示结果 - fileReader.readAsText() javascript: result not displayed fileReader.readAsText 返回一个带引号的字符串 - fileReader.readAsText returns a string with quote FileReader - readAsText 编码 utf-8 和 ANSI - FileReader - readAsText encoding both utf-8 and ANSI 抛出&#39;FileReader&#39;的fileReader.readAsText():参数1不是&#39;Blob&#39;类型 - fileReader.readAsText() throwing 'FileReader': parameter 1 is not of type 'Blob' 将FileReader.readAsText()结果字符串转换回文件对象以供下载? - Convert FileReader.readAsText() result string back into a file object for download?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM