2013-11-26 214 views
0

好吧,我一直試圖讓這個工作在過去的兩天,我無法弄清楚我做錯了什麼。我有一個稱爲「ping」的函數進行計算,並且我有一個回調函數來檢索計算的值,但我所收到的所有內容都是未定義的!Javascript函數返回undefined

var test; 

var p = ping('apple.com', function (num) { 
    test = num; 
    console.log(test); //this works, the value is displayed in the console. 
}); 

console.log("p: " +p); //says undefined 
console.log("test: " +test); //says undefined 

有人能告訴我我做錯了什麼嗎?謝謝!

編輯: 下面是ping功能:

function ping(host, pong) { 

    var started = new Date().getTime(); 

    var http = new XMLHttpRequest(); 

    http.open("GET", "http://" + host, /*async*/true); 
    http.onreadystatechange = function() { 
    if (http.readyState == 4) { 
     var ended = new Date().getTime(); 

     var milliseconds = ended - started; 

     if (pong != null) { 
     pong(milliseconds); 
     //console.log(milliseconds); 
     return milliseconds; 
     } 
    } 
    }; 
    try { 
    http.send(null); 
    } catch(exception) { 
    // this is expected 
    } 

} 
+1

你能告訴我們你的ping功能嗎?我敢打賭,p沒有返回任何東西 – Luis

+2

看起來像'ping()'是一個異步方法 –

+0

它是異步的。我如何得到這個工作? – twkl

回答

-1

可能使用同步AJAX。

function ping(host,pong){ 
    var http = new XMLHttpRequest(); 

    http.open("GET", "http://" + host, /*not async*/false); 
    http.send(null); 

    if(pong)pong(http.responseText); 
    return http.responseText; 
}; 

否則您將無法返回http.responseText

但是,這種技術並不是最好的做法,因爲它會導致頁面上的所有其他Javascript停止,直到請求完成。如果服務器需要很長時間才能回答,那麼您的頁面將無法響應。非常煩人的用戶。

請注意,如果您在問題的代碼中顯示,您將會嘗試對其他域執行AJAX操作時發生錯誤。

+0

這適用於我正在嘗試做的事情!謝謝! – twkl

2

ping異步功能 - 這意味着回調函數 「後來在某個時候」 執行。

var test;  
ping('apple.com', function (num) { 
    // this is called "at some point later" .. 
    test = num; 
    console.log(test); 
}); 
// .. but this executes IMMEDIATELY after the ping(..) function is called .. 
// .. which is before the callback (and thus assignment to `test`) 
console.log("test: " +test); 

解決的辦法是隻繼續工作作爲回調事件的結果。這可以以不同的方式隱藏 - 例如回調,承諾和期貨/觀察 - 但它始終是相同的過程。

ping(..)也返回undefined(或者更確切地說,它不return在所有),這可以解釋爲什麼p是不確定的 - 但那是次要和無關與異步特性。


How do I return the response from an asynchronous call?

+2

這完全是一個AJAX調用。這就是'XMLHttpRequest' *所要求的。 –

+0

@Asad當時隱藏了'ping'方法的源代碼。在任何情況下,事件源都是無關緊要的,並且爲了討論的緣故,只有[a]同步性很重要。 – user2864740