JavaScript采用单线程模式工作的原因:JavaScript设计之初是为了能够运行在浏览器实现页面交互,而实现页面交互的核心是操作DOM,这种模式就决定了它使用单线程模式,否则就需要解决复杂的多线程同步的问题。
这种模式的优点就是更安全、更简单,但是问题也很明显,比如遇到某个耗时的操作,那么就需要等待执行完才能往下执行。
为了解决这种问题,JavaScript语言将任务的执行模式分成了两种
- 同步模式
- 异步模式
同步模式
先把代码片段放入一个大的匿名函数中 - anonymous
然后依次入栈、出栈
异步模式
单线程是指代码的执行是单线程,而像setTimeout定时器这种webAPI,它本身是会有线程执行。要区分开代码的单线程执行。
回调函数:所有异步编程方式的根基
回调函数可以理解为一件你想做的事情,并且你明确知道这件事应该怎么做,步骤1、2、3等,但是你并不知道这件事情所依赖的任务什么时候完成, 所有最好的办法是把你的这件事情的步骤封装在一个函数里,交给所依赖的任务的执行者,当这个依赖任务完成后再执行这个函数即可。
对回调函数的理解:参考链接
Promise
回调地域
为了避免回调地域,commonJS社区率先提出Promise规范,es6在语言层面进行了标准化。
Promise使用常见误区
应该使用promise的链式调用:
异常捕获
p.then().catch() 中的catch是对整个链条异常的捕获。
而p.then(res => {}, err=>{})中的err => {}只是对当前promise异常的捕获。
因此,推荐使用catch方式。
Promise静态方法
Promise.resolve()
Promise.reject()
Promise并行执行
Promise.all()