美文网首页
Javascript同步、异步与事件循环

Javascript同步、异步与事件循环

作者: 五秋木 | 来源:发表于2019-10-22 15:14 被阅读0次
    1. Javascript是单线程的
      JS引擎中负责解释和执行JavaScript代码的线程只有一个,主线程
      处理AJAX请求的线程、处理DOM事件的线程、定时器线程、读写文件的线程(Node.js)称为工作线程

    2. 同步与异步
      函数A(arg…),函数返回的时候,调用者就能够拿到预期结果,即拿到了预期的返回值或者看到了预期的效果,这个函数就是同步的
      函数A返回的时候,还得不到预期结果,而是需要在将来通过一定的手段得到,那么这个函数就是异步的。

      fs.readFile('foo.txt', 'utf8', function(err, data) {
      console.log(data);
      });
      

      Fs.readFile函数返回时,期望的结果并不会出现,要等到文件全部读取完成之后。
      异步函数调用完毕之后,还有工作线程执行异步任务、通知主线程、主线程调用回调函数等多个步骤,这个过程叫做异步过程。

    3. 异步过程通常是:

      主线程发起一个异步请求,相应的工作线程接收请求并告知主线程已收到(异步函数返回);主线程可以继续执行后面的代码,同时工作线程执行异步任务;工作线程完成工作后,通知主线程;主线程收到通知后,执行一定的动作(调用回调函数)。

      异步函数的形式:A(args..., callbackFn)

      • 发起函数(或叫注册函数)A
      • 回调函数callbackFn
      • 例如:setTimeout(fn, 1000) fn回调函数
    4. 消息队列和事件循环
      异步过程中,工作线程在异步完成后需要通知主线程,通知机制就是利用消息队列和事件循环。
      工作线程将消息放到消息队列,主线程通过事件循环过程去取消息。
      主线程只会做一件事情:从消息队列中取消息、执行消息、再取消息、再执行/消息队列为空就等在消息队列变成非空。并且只有当前消息执行完成后,主进程才会取下一个消息。这个机制就是事件循环机制。取一次消息并执行的过程就叫一次循环。

      消息队列中消息具体是什么?消息就是注册异步任务时添加的回调函数。 image.png
    5. 异步与事件
      消息队列中每条消息实际上都对应着一个事件。
      例如按钮点击函数button.addEventListener("click", function(e){...})就是异步过程的发起函数,事件监听函数function就是异步过程的回调函数。事件触发时,表示异步任务完成,会将事件监听器函数封装成一条消息放到消息队列中,等待主线程执行。

    6. 同步保证了顺序一致,但容易导致阻塞;异步可以解决阻塞问题,但是会改变顺序性。改变顺序性其实也没什么大不了的,只不过让程序变得稍微难理解了一些。

    参考:
    Javascript同步、异步与事件循环

    相关文章

      网友评论

          本文标题:Javascript同步、异步与事件循环

          本文链接:https://www.haomeiwen.com/subject/rvyqvctx.html