1 回答

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