- 首先我们会利用异步API发起调用,无论哪一种异步任务,主线程代码的基本语义就是 关注哪个事件 + 注册回调函数
- 例1: fetch.then,就是关注指定url的响应事件,注册响应后的回调,注意调用fetch后会立即返回promise对象,主线程会把回调会注册到promise对象上
- 例2: addEventListener,就是关注某个UI事件(如click),注册事件触发后的回调,主线程会将回调注册到DOM对象上
- js宿主环境(浏览器或node)的其他线程会继续执行异步任务(如发送请求、等待响应或执行定时器)
- 一旦这个任务准备好被主线程处理(即事件被触发,如“定时器到时”,“鼠标点击”,“指定url的网络请求得到响应”),js宿主环境的线程就会将异步任务放入任务队列中。然后,事件循环会在主线程空闲时,从任务队列中取出这个任务,压入js的执行上下文
- js主线程执行相应的回调函数。这就是JavaScript处理异步任务的方式。
由于js是单线程,因为在发起异步调用之后,后续异步任务的继续执行,任务就绪后加入任务队列,事件循环读取任务队列的过程都是由宿主环境的线程完成的,对js来说都是不可见的,直到js运行回调函数