舉個(gè)例子,假設(shè)我們?cè)谝粋€(gè)網(wǎng)頁(yè)中有一個(gè)表單,用戶填寫完內(nèi)容后點(diǎn)擊提交按鈕,利用AJAX將數(shù)據(jù)發(fā)送給服務(wù)器進(jìn)行處理。接下來(lái),我們希望在JavaScript中根據(jù)處理結(jié)果更新頁(yè)面狀態(tài)或執(zhí)行相應(yīng)操作。
function submitForm() { var data = { name: document.getElementById('name').value, email: document.getElementById('email').value }; // 利用AJAX將數(shù)據(jù)發(fā)送給服務(wù)器 var xhr = new XMLHttpRequest(); xhr.open('POST', '/submit', true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { // 服務(wù)器響應(yīng)成功,執(zhí)行相應(yīng)操作 // ... } }; xhr.send(JSON.stringify(data)); }
上述代碼中,我們先獲取表單中的數(shù)據(jù),然后創(chuàng)建一個(gè)AJAX請(qǐng)求,將數(shù)據(jù)發(fā)送給服務(wù)器。當(dāng)服務(wù)器成功響應(yīng)后,我們希望執(zhí)行一些相應(yīng)操作。然而,由于網(wǎng)絡(luò)延遲或處理速度較慢,有時(shí)候JavaScript并不能立即攔截到提交的結(jié)果。
為了解決這個(gè)問題,我們可以添加一個(gè)定時(shí)器,定期向服務(wù)器發(fā)送請(qǐng)求查詢處理狀態(tài),直到結(jié)果返回成功為止。
function pollResult() { var xhr = new XMLHttpRequest(); xhr.open('GET', '/poll', true); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var result = JSON.parse(xhr.responseText); if (result.status === 'processing') { // 請(qǐng)求結(jié)果還在處理中,繼續(xù)查詢 setTimeout(pollResult, 1000); } else if (result.status === 'success') { // 請(qǐng)求結(jié)果已成功返回,執(zhí)行相應(yīng)操作 // ... } } }; xhr.send(); } function submitForm() { var data = { name: document.getElementById('name').value, email: document.getElementById('email').value }; // 利用AJAX將數(shù)據(jù)發(fā)送給服務(wù)器 var xhr = new XMLHttpRequest(); xhr.open('POST', '/submit', true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { // 成功提交到服務(wù)器,開始查詢結(jié)果 setTimeout(pollResult, 1000); } }; xhr.send(JSON.stringify(data)); }
在上述代碼中,我們添加了一個(gè)名為pollResult的函數(shù),用于定時(shí)向服務(wù)器發(fā)送查詢請(qǐng)求。當(dāng)服務(wù)器返回的結(jié)果狀態(tài)為"processing"時(shí),說(shuō)明提交仍在處理中,我們繼續(xù)等待并再次發(fā)送查詢請(qǐng)求。當(dāng)結(jié)果狀態(tài)為"success"時(shí),說(shuō)明處理成功,我們可以執(zhí)行相應(yīng)操作。
通過上述方法,我們可以解決AJAX提交后無(wú)法立即攔截到結(jié)果的問題。然而,需要注意的是,定時(shí)查詢也可能存在一些問題,如服務(wù)器過載或處理時(shí)間過長(zhǎng)。因此,我們需要在實(shí)際使用時(shí)權(quán)衡取舍,并根據(jù)實(shí)際情況進(jìn)行調(diào)整。