2 回答

TA貢獻1851條經驗 獲得超3個贊
這是新程序員面臨的一個常見問題,尤其是在處理 AJAX 調用時。即使是更有經驗的程序員也很難掌握 AJAX 功能。重要的是要記住 AJAX 中的 A 代表什么,異步。這意味著主程序將繼續運行,而另一個副程序將工作以完成一些其他任務,通常稱為線程。在這種情況下,您試圖miningTime通過從該異步調用中獲取值來返回。因為該 AJAX 調用在與主程序不同的線程上運行,miningTime所以始終為空。
為了正確實現這一點,您需要實現所謂的回調函數?;卣{函數是在異步程序完成其正在執行的操作時運行的函數。
這是它的結構:
function GetTime(callback) {
var xhr = new XMLHttpRequest();
xhr.onload = callback
xhr.open("GET", "../php/mineTime.php", true);
xhr.send();
}
function callbackFunction() {
var timeToMine = parseInt(this.responseText);
console.log(timeToMine); // outputs: NaN
var display = document.querySelector('#time'),
timer = new CountDownTimer(timeToMine),
timeObj = CountDownTimer.parse(timeToMine);
...*code continues*
}
window.onload = function () {
var callback = callbackFunction
GetTime(callback)
}
請注意,在 Javascript 中,還有其他可能的處理方式。有些東西叫做Promisesas well as async/await。在我看來,這是最簡單、最普通的方法。
更新:因為你不能有一個帶有時間參數的函數,你可以做的是傳遞一個對該函數的引用。引用函數有點像復制函數并將其粘貼到其他地方,而調用函數實際上是在運行它。您可以通過括號辨別兩者。如果在函數名后加上左括號和右括號,則調用該函數,如果省略,則僅引用該函數。

TA貢獻1779條經驗 獲得超6個贊
另一種方法是使用 Promise(IE 不支持)
function GetTime() {
? ? return new Promise( (resolve, reject) => {
? ? ? ? var miningTime = null;
? ? ? ? var xhr = new XMLHttpRequest();
? ? ? ? xhr.onload = function() {
? ? ? ? ? ? resolve(this.responseText);
? ? ? ? }
? ? ? ? xhr.open("GET", "../php/mineTime.php", true);
? ? ? ? xhr.send();
? ? })
}
window.onload = async function () {
? ? const data = await GetTime();
? ? var timeToMine = parseInt(data);
? ? console.log(timeToMine); // outputs: NaN
? ? var display = document.querySelector('#time'),
? ? ? ? timer = new CountDownTimer(timeToMine),
? ? ? ? timeObj = CountDownTimer.parse(timeToMine);
? ? ? ? ...*code continues*
- 2 回答
- 0 關注
- 195 瀏覽
添加回答
舉報