Skip to content

Instantly share code, notes, and snippets.

@bfchengnuo
Last active December 29, 2017 12:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bfchengnuo/d13c9093ff65c76386ad9f5558239f9f to your computer and use it in GitHub Desktop.
Save bfchengnuo/d13c9093ff65c76386ad9f5558239f9f to your computer and use it in GitHub Desktop.

回调不等同于异步,不回调也不等同于同步

至于阻塞,是在并行化已经跑起来之后,如果一项资源 A 在用完前 B 只能等着,这叫阻塞;

A 还没用完,不过在等待期间允许 B 用它,这叫非阻塞。

对于如同 js/node 的异步、python 的协程、erlang 的微线程,其实都是解释器(运行时)保持了一个事件队列,所有的异步调用都不过是在事件队列里新加事件, 所说的回调等也不过是加事件的形式。

JavaScript是单线程的

因为JS 运行在浏览器中,是单线程的,每个 window 一个 JS 线程,既然是单线程的,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码。

而浏览器是事件驱动的(Event driven),浏览器中很多行为是异步(Asynchronized)的,会创建事件并放入执行队列中。

javascript 引擎是单线程处理它的任务队列,你可以理解成就是普通函数和回调函数构成的队列。

当异步事件发生时,如 mouse click, a timer firing, or an XMLHttpRequest completing(ajax),将他们放入执行队列,等待当前代码执行完成。

但是浏览器是多线程的,比如一个处理 JavaScript、一个处理页面的渲染、一个处理 http 请求,setTimeout 函数的意思就是告诉 js 引擎,在 xx 以后把 func 放到主事件队列中,等待当前的代码执行完毕再执行

更多:https://www.cnblogs.com/Mainz/p/3552717.html


同步回调就是:

把函数 b 传递给函数 a。执行 a 的时候,回调了 b,a 要一直等到 b 执行完才能继续执行

异步回调就是:

把函数 b 传递给函数 a。执行 a 的时候,回调了 b,然后 a 就继续往后执行,b 独自执行。

请注意这里不要和多线程纠缠起来:线程是存在于一个进程里的,而异步回调可能是好几个进程。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment