看了題目,很多同學應該有感人三問:異步是神馬?同步是神馬?為什么不用同步非要用異步?

官方給出來的概念是這樣的:異步,就是雙方不需要共同的時鐘,也就是接收方不知道發送方什么時候發送,所以在發送的資訊中就要有提示接收方開始接收的資訊,如開始位,同時在結束時有停止位,
看了是不是更蒙?不著急,我們先看看一組代碼:
console.log(1);
setTimeout(()=>{
console.log(2);
},1000)
console.log(3);
setTimeout(()=>{
console.log(4);
},2000)
console.log(5);
按照正常人的思維,控制臺執行的順序應該是:1,2,3,4,5,但實際執行的順序卻不是這樣的,

實際執行的順序如圖:1,3,5,一秒后出現2,兩秒后出現4,
我們來嘮一下這個執行結果,控制臺列印出來的1,3,5這三條陳述句,其實就是同步陳述句,網頁一重繪它就立刻出來了,控制臺列印出來的2,4這兩條陳述句,經過1秒、2秒后出現的陳述句,就是異步陳述句,
所以,簡單來說,在計算機的執行機制里面,有兩種任務:
同步任務:在主執行緒上排隊執行的任務,只有在前一個任務執行完了,才能執行后一個任務,
異步任務:在任務佇列中排隊,等待主執行緒的任務執行完畢以后才開始執行,
現在就開始引出問題三了,為什么不用同步非要用異步?
回答:因為JavaScript這種語言是單執行緒語言,只能干一件事情,就比如一個人,總不能一邊說話一邊唱歌吧?我們不是為了異步而異步,異步的存在是有意義的,舉個栗子,比如我們要進行一個網路請求,在請求的程序中可能是1秒,也可能是10秒,如果回到解放前就更慢了,那么在等待請求這段時間里,你不能滾動,不能點擊,也沒有影片,那一定很抓狂對不對?所以我們才需要異步操作,
//異步操作
console.log('a');
setTimeout(()=>{
console.log('b');
},1000)
console.log('c');
我們再來看一下上圖,他的執行順序是:先列印‘a’,再開定時器,讓它一秒后列印‘b’,那么在時間流逝1秒鐘之前列印'c',最后才列印‘b’,那么肯定有同學要舉手提問了:假如我把定時器的1秒鐘改成0秒,會不會執行結果變成a,b,c呢?這個問題問得好,下次別問了,我們上面已經講到了這個問題,上述的可以列印a,c的陳述句是同步任務的陳述句,他們是在主執行緒優先執行的,而定時器執行的任務則是異步任務的陳述句,等待主執行緒的任務執行完畢以后才開始執行,
我們再來看看一個代碼片段
// 同步操作
console.log('i');
alert('j')
console.log('k')
執行結果:

從執行結果我們直觀的看出,上述三個執行同步任務的陳述句,在執行第二個任務,列印彈窗的時候,瀏覽器就卡在那里,你必須要點擊彈窗中的確定,才會列印出‘k’,所以這個就是同步任務執行的弊端,
敲黑白記筆記:
異步不會阻塞代碼執行
同步會阻塞代碼執行
異步這玩意后面還要跟大家嘮嘮其他相關知識點,今天就先寫到這里,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/357005.html
標籤:其他
