1 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊
更新:onreadystatechange
更正了和的一些措辭readyState
。
你打開(kāi)或關(guān)閉東西的技巧是一個(gè)好主意,盡管我不確定它是否有效或安全。無(wú)論如何,您所顯示的代碼的直接問(wèn)題是它沒(méi)有考慮您正在使用異步請(qǐng)求的事實(shí)。
您的代碼按照編寫(xiě)的順序運(yùn)行,但異步請(qǐng)求不會(huì)阻止執(zhí)行,因此第二個(gè)XMLHttpRequest
tourl
幾乎立即觸發(fā),并且早在第一個(gè)Transition()
完成之前就觸發(fā)了。
如果您需要事情按順序發(fā)生,則需要從請(qǐng)求onreadystatechange
事件處理程序調(diào)用后續(xù)步驟,該事件處理程序會(huì)在請(qǐng)求狀態(tài)更改時(shí)觸發(fā)。代碼已經(jīng)測(cè)試了readyState 4
,這意味著請(qǐng)求已完成。因此,請(qǐng)求完成后,調(diào)用的代碼就會(huì)運(yùn)行。
我不確定你的一些代碼在做什么,也許它是在上下文之外復(fù)制的(例如你的callback
, and是什么doNothing
?)。
這是一個(gè)基于您的代碼的工作 JSFiddle,對(duì)所有 3 個(gè)請(qǐng)求使用虛擬 URL。我已經(jīng)包含了一堆日志記錄,打開(kāi)您的開(kāi)發(fā)控制臺(tái)以查看事件啟動(dòng)、運(yùn)行和完成的順序。
這個(gè)想法是將回調(diào)傳遞給第一個(gè)Transition
,該回調(diào)將在請(qǐng)求完成后被觸發(fā):
function downloadUrl() { Transition(foo); }
Transition
將回調(diào)作為參數(shù),并在完成時(shí)觸發(fā)它:
function Transition(callback) {
// ... your code ...
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if (callback) {
callback();
}
}
};
// ... your code
}
這foo()是一個(gè)實(shí)際下載 的函數(shù)url,基本上是您所擁有的所有內(nèi)容downloadUrl(),但不調(diào)用Transition.
完成后foo(),您需要Transition再次調(diào)用,但這次我們不想在完成后觸發(fā)任何內(nèi)容,因此我們通過(guò)false,這Transition將測(cè)試并跳過(guò)嘗試執(zhí)行。
我寫(xiě)得很快,感覺(jué)有點(diǎn)笨拙,您可能可以稍微修改一下以使其更整潔,但它演示了使用事件處理程序通過(guò)異步請(qǐng)求順序執(zhí)行操作的基本思想。
- 1 回答
- 0 關(guān)注
- 129 瀏覽
添加回答
舉報(bào)