javascript - javascript异步或同步中的fileReader?
问题描述
我正在研究 excel 克隆,并使用以下代码实现了在网络上打开 excel 表的功能,但我不太了解代码的内部,因为我是 javascript 的新手。所以请帮助我了解代码。我的代码是 -
<input type="file" onchange="readFile(this)">
<script>
function readFile(input) {
let file = input.files[0];
let reader = new FileReader();
reader.readAsText(file);
reader.onload = function() {
console.log(reader.result);
};
reader.onerror = function() {
console.log(reader.error);
};
}
</script>
这很有用,但我没有得到它的异步性质,因为我知道 onLoad 是一种 addeventListener ,它将在浏览器 API 中运行,因此当负载发生变化时,它将触发回调函数。
但是 reader.readAsText(file) 呢?
我的猜测是它正在异步读取文件,但是如果它以异步方式读取文件,为什么没有附加到它的回调函数将在它完成读取文件后运行,如我们在 fs 模块 fileread() 函数中看到的那样有一个特定的回调来知道现在文件读取是完成还是失败。
所以请帮助我了解 reader.readAsText(file) 这是如何异步的,以及它是否是异步的,或者只是我完全混淆了两种不同的场景。
解决方案
如今,当我们在 blob 上有新的读取方法时,FileReader 现在几乎没有什么好处(您只需要 IE 来使用它 - 现在几乎已经死了)
如果您要读取二进制(excel)文件(而不是 ascii 文本文件),那么您无法将内容作为文本读取,b/c 会发生一些编码转换并使字符串无效,因此您应该实际阅读它作为arrayBuffer
一种异步但感觉同步的现代方法看起来像这样:
async function readFile (input) {
const [file] = input.files
if (!file) return // in case input have been cleared
const buffer = await file.arrayBuffer()
const uint8 = new Uint8Array(a)
}
(更少的代码,没有回调,并且仍然是异步的)(在 blob 上使用新的读取是首选,因为它在 Deno 和 NodeJS 服务器上增加了更广泛的平台支持)
推荐阅读
- ruby-on-rails - 如何将供应商资产导入 webpacker?
- highcharts - 如何在 Highcharts 中使用外部按钮导出 CSV 和 XLS
- c# - Xamarin 表单更新 UI
- autoconf - 使用 autoconf 为汇编语言程序创建构建脚本
- javascript - 在 d3 地理图上的固定位置附加链接图形
- yii2 - 另一个小部件 Yii2 中小部件资产的问题
- c++ - 虚函数和多态 - 代码解释
- ruby-on-rails - Rails 使用 JSON 将深度嵌套属性到 Vue 实例
- python - 缓存是否意味着在过期之前没有条件语句?
- php - 致命错误:不在对象上下文中使用 $this - OOPHP