【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’

以上实现了获取异步操作的值,利用此原理才能封装含异步操作的步骤,不然得到的值和希望的值不一致

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