这几天涉及一些前端网络请求的问题,听得最多的就是ajax发送请求,
回调函数
回调函数的概念我在文章中有提到,是作为另一个函数的参数被调用的函数称之为回调函数。
之所以称之为回调,是因为我们正常调用系统内部函数时是正调,那么反过来系统调用自定义的函数就称之为回调。典型的像Ajax上传文件中的success函数。
事件轮询
事件轮询机制字面理解的话就是对事件进行循环执行,到底什么意思呢?看一张图:
事件轮询(event loop)就是对事件队列循环读取的一种机制。
为什么需要这种机制,应该说它是一种有效地实现单线程异步的方式。
我们结合js的异步过程,来看下轮询机制的用法:
(1) 所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2) 主线程之外,还存在一个"任务队列"(task queue)。只要ajax,onclick等异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3) 一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4) 主线程不断重复上面的第三步。
回调与异步
回调常常与异步联系在一起,因为是系统调用自己定义的函数,结合轮询机制可以实现js的异步,就如上所述步骤。值得注意的是浏览器中很多行为是异步(Asynchronized)的,例如:鼠标点击事件、窗口大小拖拉事件、定时器触发事件、 XMLHttpRequest完成回调等,这并不代表js本身是异步的,而是浏览器的操作。
参考:
为什么javascript是单线程的却能让AJAX异步调用?
JS中的异步以及事件轮询机制
什么是 Event Loop?