写在前面:大家好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’
以上实现了获取异步操作的值,利用此原理才能封装含异步操作的步骤,不然得到的值和希望的值不一致