单线程JavaScript异步方案
我们要知道,js的运行环境都是以单线模式去执行的js代码。
注:
1)javascript是单线程的,浏览器并不是单线程的;
2)javascrpt调用的某些内部的api并不是单线程的,例如倒计时器,内部会有个单独的线程去负责倒数;
3)我们指定单线程是指的执行代码的单线程;
4)运行环境提供的API是以同步或异步模式的方式工作,同步模式的API:代码执行完代码才会往下走,异步模式的API下达这个任务开启的指令,不会等待任务结束的,会继续往下走。
采用单线程模式工作原因:
最早javascript是运行在浏览器上的脚本语言,目的实现页面上的动态交互,而实现页面交互核心就是dom操作,这也就决定了必须使用单线程模型,否则会出现复杂的线程同步问题;这里的单线程指的是:js执行环境中负责执行代码的线程只有一个;
优点:更安全更简单
缺点:如果有耗时操作,那么后面的任务排队就会等待时间延长(耗时阻塞),出现假死的情况
为了解决这个问题,JavaScript将任务的执行模式分为了两种:
同步模式
异步模式
es2015中的promise异步编程方案、宏/微
es2017中的async/await
同步模式
排队执行,和代码书写顺序一致
js引擎会将全部的代码加载进来,然后在调用栈call stack(js在执行引擎中维护了一个正在执行的工