為什麼監聽能放在請求的後面及非同步同步理解
阿新 • • 發佈:2021-11-05
//1.執行非同步ajax請求 //建立xhr物件 const request = new XMLHttpRequest() //開啟連線(初始化請求,沒有請求) request.open(method, url, true) //傳送請求 if (method === 'GET') { request.send() } else if (method === 'POST') { console.log('到這裡了'); request.setRequestHeader('Content-Type', 'application/json;charset=utf-8'); //告訴伺服器請求體的格式是json request.send(JSON.stringify(data)) //傳送json格式請求體引數 } //繫結狀態改變的監聽 request.onreadystatechange = function() { } // 繫結狀態改變的監聽,為什麼監聽可以放在後面, //因為監聽onreadystatechange它不是非同步的程式碼從上往下執行,傳送請求需要時間, //它是非同步的需要時間,所以執行同步程式碼-同步阻塞,非同步-不阻塞。所以先執行了監聽。 //這個非同步跟同步的概念 其實是指程式碼阻塞,因為時同步,所以必須執行上面才能執行下面, //造成程式碼阻塞,跟非同步,就是執行這個程式碼的同時可以執行其它程式碼,不阻塞
//阻塞的 程式碼,對於左邊,必須要等GET返回後,才會往下執行 //右邊的不會,右邊的會一直往下執行,不等待返回 //fetch是跟get類似的 //JS 在以前是沒有同步的 直到添加了await 跟 Promise才出現了同步,這個是ES6新增的,現在已經幾乎都支援了,除了IE 可以放心用 // XMLHttpRequest 這個是非同步的 非阻塞的 在ES6 也就是2015之前是沒有同步的 node 裡面的fs 模組 讀取檔案的時候 也有這個 async 跟 非async //用sync的方法 讀取檔案就會阻塞 非同步是js一出生就自帶的特性 但是 非同步不符合人類的思維習慣,然後才搞了同步 寫程式碼的時候 肯定是同步的程式碼 對於人類更容易理解看懂 //但是 對於計算機來說,非同步的程式碼是更高效率的 非同步跟同步 可以實現的功能是一樣的,但是同步的程式碼更好看 //promise 跟await 讓程式碼更好看了,功能上跟之前非同步是一樣的--之前非同步操作then, //也是讓非同步結果按我們想要的順序執行下去,之前的非同步操作想要按我們想要的順序執行下去所以會出現難看的回撥地獄,現在promise是為了解決這個難看