鍍金池/ 問答/數(shù)據(jù)庫  HTML/ ajax的send同步問題

ajax的send同步問題

 var xhr = new XMLHttpRequest();
    xhr.open("get","1.html",false);
    xhr.onreadystatechange = function () {
        console.log(xhr.readyState)
    }
    xhr.send();

為什么同步就只能輸出4,異步的任務(wù)隊(duì)列我知道可以輸出2,3,4,但是同步是不是就沒有往任務(wù)隊(duì)列里面加任務(wù)了,但是同步和異步的區(qū)別不就是在send這里會等著嗎,在等著的過程中onreadystatechange 不也會觸發(fā)嗎

回答
編輯回答
選擇

clipboard.png

如果你有興趣讀標(biāo)準(zhǔn)可以看看 https://xhr.spec.whatwg.org/

2017年2月13日 20:56
編輯回答
葬憶

是這樣的。

先來看下state的狀態(tài)又哪些:

0 UNSENT - open()has not been called yet
1 OPENED - send()has not been called yet
2 HEADERS_RECEIVED - send() has been called, and headers and status are available
3 LOADING Downloading; - responseText holds partial data
4 - The operation is complete

如果發(fā)送了同步請求,
那么此時(send代碼執(zhí)行后)瀏覽器會掛起,直到請求體響應(yīng)完成,然后改變state值,從而觸發(fā)下面的代碼:

xhr.onreadystatechange = function () {
    console.log(xhr.readyState)
}

由于此時已經(jīng)請求響應(yīng)完成,所以狀態(tài)直接就是4了。` 換句話說,假如2,3你能監(jiān)聽的到又怎么樣?

線程阻塞著呢,你能干啥?`

而如果是異步的,在請求真正的完全響應(yīng)之前,2,3狀態(tài)的回調(diào)函數(shù)會被執(zhí)行。

另外同步是不建議使用的, 在同步中去監(jiān)聽onStateChange更是不應(yīng)該。

clipboard.png

2018年1月29日 18:04