我在保存从FileReader
读取的文件中提取的数据时遇到麻烦。
在onload
函数的作用域中,数据似乎存在,但是尝试将所述数据存储在作用域之外的变量中似乎无效。
MWE:
http://jsfiddle.net/eqaw0hbf/1/
(上传任何文本文件,您都会明白我的意思)
最佳答案
我的意思是说onload函数是异步的。换句话说,它会在加载结束后触发并仅执行“ function(e){}”作用域(因此名称为“ onloadend”)。同时,在等待加载结束时,“ function(e){}”范围之外的程序其余部分将继续执行。并不是说数据没有存储在文本变量中。只是在“ function(e){}”作用域才有机会将“ text”变量设置为非空值之前发生了第14行“ alert(text)”调用。
同样,您的代码将开始并执行第2-3行,然后跳至第10行(并打印警告(文本),该文本只是“”,因为从未执行过函数(e),因此文本从未设置为任何内容)。当服务器或请求为“ lr.onloadend”最终收到其数据时,您的程序将跳回到第6行并在lr.onloadend = function(e){}中执行作用域并设置文本变量。
您应该做的是将依赖于文本的任何数据处理放在onload的回调内,在此范围内:lr.onloadend = function(e){}
。基本上,只要您具有异步功能,就应该假定内部发生的任何事情都在更高范围的所有代码之后发生。任何不在“回调”函数中的内容都将按照您期望的顺序正常执行。回调函数中的所有内容仅在触发回调时发生。因此,您不能使回调函数外部的事情依赖于回调函数内部发生的事情。不能保证异步回调中设置的信息随时可以“触发”,随时可以在其他任何地方使用。
该链接在解释Node.js / Javascript中的回调方面做得很不错:
http://cwbuecheler.com/web/tutorials/2013/javascript-callbacks/