Web 开发容许 js 程序的一部分在一个独立的线程中运行,该线程能够与 js 主线程并行运行;可是这并不意味着咱们能够在 js 程序中引入多线程操做,由于在多线程操做中两个独立的线程之间是能够经过异步事件相互通讯的,他们彼此之间经过事件轮询机制(event-loop)一次一个的来运行,所以在咱们使用 setTimeOut 的时候,多个 setTimeOut 之间实际上是会存在时间上的偏差,形成这个偏差的缘由就是 javaScript 的单线程机制;java
es6 中的 generators 函数容许在运行的过程当中暂停一次或者屡次,随后再恢复;暂停的过程当中容许其它的代码执行;genrators 函数中的并发机制使用的是 coopeerative 类型的并发机制,经过使用新的 yield 关键字从内部将函数的运行打断;并且在下一次从新启动的时候再传入值;es6
在进程中存在两个概念:协做(cooperative) 和 抢占(preemptive);cooperative 说明一个进程自己能够选择什么时候被中断以便与其它代码进行协做;preemptive 恰好是和 cooprative 相反的,它代表一个进程或 function 能够被其自身的意愿打断;多线程
generators 的命名,例如 function *foo();在函数中经过 yield 进行暂停,经过 next() 方法或者函数自己进行再次的启动,调用 next() 方法的时候都会返回一个对象 { value: val, done:false} ;value 是 暂停时候的返回值;可是这个并非 returen 语句的返回值,而是 yield 表达式的值;done 表示函数有没有运行完成;在 generators 函数中是不建议使用 return 的;并发