質問: 200) ){ //ここに何か書けばよいのだろうが記述方法がわからない。 //alert(httpObj.responseText); } } } ``` ### 試したこと 読み込んだファイルの内容をalertで表示することはできました。
回答: もしかして、`loadFile()`をこんな風に使えるようになりたいということでしょうか? ``` var list = [], resultText; resultText = loadFile('htttp://example.jp/test.txt'); list.push(resultText); // 以下、listに対する処理が続く ``` 上のような処理ができる`loadFile()`を実装することは**できません**。JavaScriptは非同期であり*処理を待つ*という動作自体ができないからです。できることは*何かが起きたときに行う処理を設定する*ことで、XMLHttpRequestではonreadystatechangeでの設定がそれにあたります。 では、今回のような場合はどのようにするかというと、コールバックを使います。 ``` function loadFile(fileName, callback){ var httpObj = new XMLHttpRequest(); httpObj.open('GET', fileName+"?"+(new Date()).getTime(), true); httpObj.send(null); httpObj.onreadystatechange = function(){ if ( (httpObj.readyState == 4) && (httpObj.status == 200) ){ callback(httpObj.responseText); } } } var list = []; loadFile('htttp://example.jp/test.txt', function(resultText) { list.push(resultText); // 以下、listに対する処理が続く }); ``` コールバック関数の中身は、データを取得した後に非同期で実行されます。つまり、処理を待ってから行ったといると言えます。JavaScriptはこのようにブロックする処理自体が存在できないため、コールバックを使って、次にやりたい処理をなかにどんどん書き足していく形になります。 なお、このコールバックですが、どんどんコールバックを追加していくと処理が深くなり、複雑になってしまう場合があります(コールバック地獄と呼ばれる)。それを回避するためにECMAScript2015からはPromiseというのが用意されていますので興味があれば調べてみてください。