异步

为什么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完全是自动执行异步任务的。

  

来源:https://juejin.im/entry/58f952c2a22b9d006589f77d

来源:http://www.ruanyifeng.com/blog/2014/10/event-loop.html

原文地址:https://www.cnblogs.com/panjingshuang/p/11891186.html