实际上,这很可能是范围问题。由于您异步设置allText,因此函数返回后将无法立即使用它。另外,您将在函数中重新初始化allText,这无论如何都会影响返回范围。
rawFile.onreadystatechange函数返回后执行。您可以将执行移到XHR回调中,也可以将函数包装在promise中,这仍然需要您稍微修改控制流。
移动document.write
:
<!DOCTYPE html><html> <script> function readTextFile(file) { var allText; var rawFile = new XMLHttpRequest(); rawFile.open("GET", file); rawFile.onreadystatechange = function () { if(rawFile.readyState === 4) { if(rawFile.status === 200 || rawFile.status == 0) { allText = rawFile.responseText; document.write(allText); } } } rawFile.send(null); } readTextFile("foo.file"); </script></html>
promise:
function readTextFile( file ) { return new Promise( function ( fulfill, reject ) { var allText; var rawFile = new XMLHttpRequest(); rawFile.open( "GET", file ); rawFile.onreadystatechange = function () { if ( rawFile.readyState === 4 ) { if ( rawFile.status === 200 || rawFile.status == 0 ) { fulfill( rawFile.responseText ) } } } rawFile.send( null ); } );}readTextFile( "foo.file" ) .then( function ( t ) { document.write( t ); } );
这两种方法都将确保您的脚本在XHR请求返回之前不会尝试使用allText。
尽管正如SantiagoHernández所指出的那样,XHR请求是同步的,范围问题的性质与我最初设想的不同。问题在于在函数中重新声明变量,导致返回的变量未定义。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)