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