【nodejs】封裝異步API,理解回調函數

寫在前面:大家好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’

以上實現了獲取異步操作的值,利用此原理才能封裝含異步操作的步驟,不然得到的值和希望的值不一致

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章