我想读取一个文件,并使用FileReader对象将其转换为base64编码字符串。下面是我使用的代码:
var reader = new FileReader();
reader.onloadend = function(evt) {
// file is loaded
result_base64 = evt.target.result;
};
reader.readAsDataURL(file);
但在本例中,我在事件处理程序(onLoadEnd事件)中获得了转换的结果。我希望使用同步方法。是否有一种方法可以让“readAsDataURL”方法直接返回'result_base64'变量的值?
7条答案
按热度按时间zour9fqk1#
在Node.js中,使用
child_process
中的execSync
,并让shell为您同步读入它。将此子进程的输出重定向到父进程。我很高兴接受你对UUOC奖的提名。)
bwitn5fc2#
您可以使用标准的FileReaderSync,它是FileReader API的一个更简单、同步、阻塞的版本,类似于您已经在使用的版本:
请记住,由于显而易见的原因,这只在工作线程中可用。
如果你需要一个主线程的解决方案,它“读起来像”一个同步API,也就是顺序的,你可以把异步FileReader Package 在一个promise中,并使用异步函数(你可能需要transpile):
然后,您可以在另一个异步上下文中等待该函数:
...或者只是使用约定回调来使用它(不需要异步上下文):
dfuffjeb3#
同步任务(阻塞)通常是不好的。如果没有真实的的理由同步地做那件事,我强烈建议你使用事件回调。
假设你的文件坏了,HTML5 api无法读取,它不会给予你结果。它会破坏你的代码并阻止网站。或者,有人可能选择了一个10GB的文件,这会冻结你的HTML页面,直到文件完全加载。通过异步事件处理程序,你可以捕捉可能的错误。
为了解决回调的限制,我使用了一个简单的技巧:
检查函数,每秒钟检查一次就绪标志变量是否被设置为真。2如果是,你可以确定结果是可用的。
这样做可能不是最好的做法,但我使用这种技术制作了一个Web应用程序,大约30次,同时运行10多个setTimeouts,直到现在都没有遇到任何问题。
wkyowqbh4#
截至2022年11月1日,file.getAsDataURL()已经过时,这是唯一的直接同步方法,只需将File对象传递给下面的函数,该函数将返回一个数据url。
下一个函数只是一个将File对象转换为二进制字符串的通用函数(以防有人在搜索它):
如果需要ArrayBuffer,请使用此函数:
vaj7vani5#
下面的代码以同步方式读取文件
用法:
thtygnil6#
要同步读取文件的内容,请使用fs.readFileSync
创建一个读取流。
z9gpfhce7#
下面的代码以同步方式读取文件并以文本(字符串)形式返回其内容
用法: