「异」曲同工 —— Generator
3 月,跳不动了?>>> 介绍 大家都知道,JS是一门单线程语言,所谓"单线程"就是一次只能完成一件任务。若是多个任务,就要排队执行,前面一个任务完成,后面一个任务再去执行。如果加入某个任务耗时过长,那么后面的任务就要一直等待下去,这样就会拖慢了整个程序,例如:一段死循环代码,就会使得进程卡在这。这就是同步的缺点。而解决这类问题就需要另一种任务处理方式: "异步",这种模式可以参考 ajax 、setTimeout 这类方法,调用方法后不会等到它执行完成,而是直接执行后续代码。 ajax 方法执行完成后通过状态通知主线程,或者通过回调处理 ajax 的执行结果。 背景 现在前端与后台通信,一般都是采用的异步请求的方式,这样接口互不干扰,页面各部分渲染自己的数据,就好比我们定时蒸米饭,蒸饭过程中去炒菜了,焖饭在进行,时间到了后,我们收到通知饭闷好了。目前前端主要使用 ES6 的 promise , ES7 中的 async await 去实现异步方法。 对于异步编程的核心思想,我们先了解下他的运行机制: 程序中所有同步任务都会在主线程上执行,形成一个执行栈。 在主线程之外存在一个"任务队列"。当我们的异步任务有了结果,他就会往"任务队列"中放一个事件。 当"执行栈"中的所有同步任务执行完成后,他会自动去读取"任务队列"中的事件,里面的这些事件都是等待状态的。取出对应的异步事件