2017-08-25 2 views
0

Googleで例を検索したところ、私が見つけたすべての例は以下のような匿名関数を使用していました。しかし、コードを複雑にするので、私はそれを避けたいです。XMLHttpRequest非同期読み取り、匿名関数を使用しないでください。

var xhr = new XMLHttpRequest(), 
    method = "GET", 
    url = "https://developer.mozilla.org/"; 

xhr.open(method, url, true); 
xhr.onreadystatechange = function() { 
    if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) { 
    console.log(xhr.responseText); 
    } 
}; 
xhr.send(); 

私がこのようにしたい場合、どのようにリクエストまたはレスポンスを渡すことができますか?

function startRequest() 
{ 
    var xhr = new XMLHttpRequest(), 
     method = "GET", 
     url = "https://developer.mozilla.org/"; 

    xhr.open(method, url, true); 
    xhr.onreadystatechange = myhandler; 
    xhr.send(); 
} 

function myhandler() 
{ 
    //how to get xhr here? 
    if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) 
    { 
    console.log(xhr.responseText); 
    } 
} 

私は静的型付けされた言語をよく知っているので、JavaScriptは混乱します。私はonreadystatechangeの署名(入力パラメータ)を見ようとしましたが、ドキュメンテーションのページには言及していませんでした。動的に型付けされた言語(Python、PHP)のドキュメントは入力パラメータを形式的に記述しない傾向があるので、どのような型のパラメータを取るべきかを推測する必要があります。

パラメータはありません。グローバル変数を使用して、要求と応答をmyhandlerに渡す必要がありますか?より良い方法がありますか?

+2

「this」を使用してください。要求オブジェクトを参照します。 (なぜなら、 'myHandler'はリクエストの状態変更イベントリスナとして渡されるからです)。 –

+0

'startRequest'の中に' myHandler'定義を置くこともできます。それは変数のスコープ内にあります。 – Barmar

答えて

1

応答オブジェクトを含むハンドラにxhrオブジェクトを渡すことができます。

function startRequest() 
{ 
    var xhr = new XMLHttpRequest(), 
     method = "GET", 
     url = "https://stackoverflow.com/questions/45887959/xmlhttprequest-asynchronous-read-how-not-to-use-anonymous-function"; 

    xhr.open(method, url, true); 
    xhr.onreadystatechange = myhandler(xhr); 
    xhr.send(); 

} 

function myhandler(xhr) 
{ 
    //how to get xhr here? 
    if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) 
    { 
    console.log(xhr.responseText); 
    }else if(xhr.status===0){ 
     console.log(xhr.responseText); 
    } 
} 

startRequest(); 
関連する問題