2 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊
這是新程序員面臨的常見(jiàn)問(wèn)題,尤其是在處理 AJAX 調(diào)用時(shí)。即使是更有經(jīng)驗(yàn)的程序員也很難掌握AJAX功能。重要的是要記住 AJAX 中的 A 代表什么,即異步。這意味著主程序?qū)⒗^續(xù)運(yùn)行,而另一個(gè)側(cè)程序?qū)⑼瓿善渌恍┤蝿?wù),通常稱(chēng)為線程。在此實(shí)例中,您嘗試通過(guò)從該異步調(diào)用中獲取值來(lái)返回。因?yàn)樵?AJAX 調(diào)用在與主程序不同的線程上運(yùn)行,因此 將始終為 null。miningTimeminingTime
為了正確實(shí)現(xiàn)這一點(diǎn),您需要實(shí)現(xiàn)所謂的回調(diào)函數(shù)。回調(diào)函數(shù)是在異步程序完成其正在執(zhí)行的操作時(shí)運(yùn)行的函數(shù)。
它應(yīng)該如何構(gòu)建:
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)
}
請(qǐng)注意,在 Javascript 中,還有其他可能的方法來(lái)處理這個(gè)問(wèn)題。有些東西被稱(chēng)為以及。在我看來(lái),這是最簡(jiǎn)單,最普通的方法。Promisesasync/await
更新:由于您不能使用具有時(shí)間參數(shù)的函數(shù),因此您可以改為傳遞對(duì)該函數(shù)的引用。引用函數(shù)有點(diǎn)像復(fù)制函數(shù)并將其粘貼到其他位置,而調(diào)用函數(shù)實(shí)際上運(yùn)行它。您可以通過(guò)括號(hào)來(lái)辨別兩者。如果在函數(shù)名稱(chēng)后添加左括號(hào)和右括號(hào),它將調(diào)用該函數(shù),如果省略它們,則該函數(shù)將僅被引用。

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
正如@EricBrown中提到的,另一種方法是使用承諾(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*
添加回答
舉報(bào)