2016-07-02 22 views
0

これは私の問題です。ファイルを取得して内容を返す関数があるため、ホストプロバイダはPHPを使用できません。javascriptの匿名関数が変数を更新しない

function getStoryFromFile(file){ 
    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     if (xhttp.readyState == 4 && xhttp.status == 200) { 
      return xhttp.responseText; 
     } 
    }; 
    xhttp.open("GET", file, true); 
    xhttp.send(); 
} 

そして、私は匿名関数がそのようには機能しないことを発見しました。それで、私はそれをそうすることによって動作させようとしました。

function getStoryFromFile(file){ 
    var xhttp = new XMLHttpRequest(); 
    var x = 'false'; 
    xhttp.onreadystatechange = function() { 
     if (xhttp.readyState == 4 && xhttp.status == 200) { 
      x = 'true'; 
     } 
    }; 
    xhttp.open("GET", file, true); 
    xhttp.send(); 
    if (x == 'true'){ 
     return xhttp.responseText; 
    } 
} 

しかし、それもうまくいきませんでした。だから私は何時間もそれを微調整しようとしましたが、何も働いていません。私が得るすべては、「未定義」です。だから、誰かがJavascriptで2番目の方法でコンテンツを返すことができない理由、なぜjavascriptの開発者がそのような言葉を理解しにくい言語にしたのかを私に説明してください。ありがとうございました。

EDIT どのように変数に書き込むためのコールバック関数を取得しますか? 私が持っている:

function displayPage(){ 

file = 'story1.html' //Not actually like this in file, it changes based on database but i simplified it 
var toHTML = ''; 
getStoryFromFile(file,function(text){ 
toHTML += text + "<br>"; 
}); 
document.getElementById('div').innerHTML = toHTML; 
} 

無名関数は、それがグローバルだにもかかわらず書き込みません。今の主な問題です

+0

*「なぜjavascriptの開発者はこのような言葉を理解するのが難しいのですか」* - どのようなプログラミング言語でも、実際にはどのように動作するかを知るためには時間が必要です。あなたが持っている問題は、非同期関数、いくつかの他の言語には当てはまらない概念です。 – nnnnnn

+0

[Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)は新しい方法です... –

+0

リンクされた重複した質問にはjQueryのコンテンツがありますが、非同期関数でこの問題をよく説明しており、いくつかのプレーンJavaScript(非jQuery)テクニックについてはカバーしていますが、[この回答](http://stackoverflow.com/a/16825593/615754)はすべてプレーンJavaScriptです。 [この質問](http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron)には、いくつかの有用な情報がありますあなたのために。 – nnnnnn

答えて

1

いいえ、それは非同期呼び出し(無名関数とは関係ありません)なので、動作しません。適切なことは、代わりにコールバック関数を提供することです。

function getStoryFromFile(file, callback){ 
    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     if (xhttp.readyState == 4 && xhttp.status == 200) { 
      callback(xhttp.responseText); 
     } 
    }; 
    xhttp.open("GET", file, true); 
    xhttp.send(); 
} 

getStoryFromFile('someFile', function(text){ 
    // do something with the responseText. let's console.log it: 
    console.log(text); 
}); 
+0

2番目の引数はコールバック関数です。これは無名関数/クロージャです。問題は、AJAXリクエストが送信されるので、あなたはそれがいつ戻るかわからない...それは20msかもしれない、それは5sかもしれない...あなたが戻り値を待っている残りの実行をブロックするならば、あなたのアプリの他の部分を壊す可能性が高い。同期コールに設定することはできますが、これはめったにお勧めできません。代わりに、Ajax呼び出しが完了すると呼び出される関数を提供します。この場合、応答をconsole.logにする関数です。 –