寫在前面:大家好K。首先爲你點進這篇有趣的文章點贊👍!文章在撰寫過程中難免有疏漏和錯誤,歡迎你在下方留言指出文章的不足之處;如果覺得這篇文章對你有用,也歡迎你點贊和留下你的評論。更多內容請點進👉我的博客K。👈閱覽。
問題:封裝含異步的步驟時,發現希望值和實際值不一致
1. 同步、異步、多線程與多進程
同步/異步是單線程
同步:自頂向下地運行程序,缺點:當前一步花費時間長,甚至直接卡在那兒(主動等待響應),則會發生阻塞(其他任務被掛起了)
異步:發送請求後,得到響應前,先執行其他代碼(不主動詢問響應)
function fn() {
let data = 'ago'
setTimeout(function () {
data = 'now'
}, 1000)
// console.log(data)
return data
}
console.log(fn())
例:
按同步思想,結果應爲’now’字符串,但是實際不是這個結果;
按異步思想,setTimeout()
函數需要等待1秒,並不能馬上完成,所以先直接輸出原數據
那麼該如何獲取異步操作的值?轉到2節
併發、並行和多線程、多進程
多線程:是實現異步的一個手段,只有一個處理器進行計算,哪個線程準備好計算就處理哪個線程
併發:多線程
並行:多個處理器就可以並行了,多的處理器能同時處理別的的線程
多進程:並行時,可以同時處理多個進程
(再更與阻塞非阻塞的關係)
2. 回調函數
本質
是指針作爲函數參數傳遞的應用(傳函數就是傳指針)
點擊學習函數指針
解決辦法
function fn(callback) {
let data = 'ago'
setTimeout(function () {
data = 'now'
callback(data)
}, 1000)
}
fn(function callback(param) {
console.log(param)
})
前7行定義函數,後3行調用函數
調用時的實際參數是一個函數(名callback),設實參的地址爲0x66666(強調!傳函數就是傳指針),則第一行的形參接收的值就爲0x66666
等1秒,運行到第4行改變data值(setTimeout(後進行的操作, 等待時間)
)。然後調用0x66666位置的函數,實參爲剛修改了值的data,結果即可輸出’now’
以上實現了獲取異步操作的值,利用此原理才能封裝含異步操作的步驟,不然得到的值和希望的值不一致