异步
为什么Javascript得是单线程?
JS单线程:假如再对DOM进行操作的时候,多个线程同时删除和添加的时候,就会出现问题
单线程造成的问题:
一个任务执行完成之后才能执行下一个,如果是在读取大量数据的文件的时候,这只能是先将大文件读取之后才能继续执行之后的任务。这就造成了时间上的不必要浪费。于是就有了多线程
如何实现异步:
1.主线程上有一个"执行栈",其中存放着所有的同步任务
2.还有一个“任务队列”(先进先出),存放着有了结果?(啥就有结果了)的异步任务
3.当所有的同步任务都结束之后(执行栈为空的时候),就检查异步任务队列中的任务是否可以放到主线程执行(例如:定时器任务,得等到时间才能执行)
异步任务队列:
异步任务队列中异步任务主要是 1.IO事件的异步任务 2.用户的交互事件:点击事件等 这些事件通过回调函数来表现,也就是说指定相对应的回调函数,放到异步任务中,当执行栈执行异步任务的时候就是在执行相对应的回调函数。
任务有同步任务和异步任务,同步任务就是按主线程的执行顺序执行,即使是遇到大量数据的读取这样的操作的时候,也得先等待读取操作结束,再继续执行之后的任务;异步任务是:遇到像读取大量数据的操作的时候,就执行后面的同步任务,将读取大量数据的操作结果放到异步任务中(?)
异步编程:
1.传统:回调函数
2.Promise
3.Generator
4.async
传统的调用方式回调函数,当遇到多个异步任务并需要按照一定的顺序执行的时候,可能会出现“回调地狱”问题。
Promise通过将异步任务通过链式的方式,实现多个异步任务的顺序执行,一定程度上避免了回调地狱的问题。
Generatot通过yield来暂停任务的执行,next恢复执行,当前异步任务结局一个之后就next
async是ES6的语法糖,本质上就是Generator,但是Generator需要自己手动执行(手动调用next函数),async完全是自动执行异步任务的。