同步任务 && 异步任务
程序里面所有的任务,可以分成两类:同步任务(synchronous)和异步任务(asynchronous)。
-
同步任务是那些没有被引擎挂起、在主线程上排队执行的任务。只有前一个任务执行完毕,才能执行后一个任务。
-
异步任务是那些被引擎放在一边,不进入主线程、而进入任务队列的任务。只有引擎认为某个异步任务可以执行了(比如 Ajax 操作从服务器得到了结果),该任务(采用回调函数的形式)才会进入主线程执行。排在异步任务后面的代码,不用等待异步任务结束会马上运行,也就是说,异步任务不具有”堵塞“效应。
-
举例来说,Ajax 操作可以当作同步任务处理,也可以当作异步任务处理,由开发者决定。如果是同步任务,主线程就等着 Ajax 操作返回结果,再往下执行;如果是异步任务,主线程在发出 Ajax 请求以后,就直接往下执行,等到 Ajax 操作有了结果,主线程再执行对应的回调函数。
任务队列和事件循环
-
JavaScript 运行时,除了一个正在运行的主线程,引擎还提供一个任务队列(task queue),里面是各种需要当前程序处理的异步任务。
首先,主线程会去执行所有的同步任务,等到同步任务执行完了,就去看任务队列里面的异步任务。如果满足条件,那么异步任务就会进入主线
程开始执行,这时他就变成同步任务了。 -
等到执行完,下一个异步任务再进入主线程开始执行。一旦任务队列清空,程序就结束执行。
-
异步任务通常写法是回调函数,一旦异步任务进入主线程,就会执行对应的回调函数,如果异步任务没有回调函数,那么就不会进入任务队列,
也就是说不会重新进入主线程。 -
那么问题来了,JS引擎是如何知道异步任务有没有结果,能不能进入主线程呢?答案是JS引擎在不断地检查,一遍又一遍,只要同步任务执行完了,引擎就会去检查那些挂起来的异步任务,是不是可以进入主线程。这种循环检查的机制,就是事件循环(Event Loop)。
网友评论