2017-08-25 62 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

您也可以將'myHandler'定義放入'startRequest'中,然後它將在變量的範圍內。 – 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();