js中yield

JavaScript021

js中yield,第1张

生成器是ES6引入的新的函数形式, 可以在执行当中暂停自身,可以恢复执行,并不像普通函数那样保证运行到完毕。

生成器并不会立即执行,需要调用它的next(..)方法才会执行,调用return()方法则会终止生成器的运行

yield用来标示暂停点,也可放在循环中,用来表示一个重复暂停点。

且在暂停时,会生成一个值,在调用nex(..)时,yield也会接收next传入的参数

*使得yield成为了yield * ,称之为yield委托(yield delegation)。yield * .. 需要一个iterable;然后它会调用这个迭代器,把自己的生成器控制权委托给这个迭代器,直到其耗尽。

以上效果是相同的

上述错误的调用中,会的到如下结果

{ value: 7, done: false }

{ value: undefined, done: true }

因为在while判断中的next也会进行消耗,导致输出结果与预期不符,得到的只是符合条件的偶数项

它的意义在于,可以在不同阶段从外部直接向内部注入不同的值来调整函数的行为(这一点是其他循环很难做到的,或要付出较大的代价才可以做到)

如果刚才没有让你有一个清晰的认识,那么这个例子一定会让你彻底明白的

next() 传参是对yield整体的传参,否则yield类似于return

在前端项目中,用的机会很少,完全可以忽略他的存在,但是在后台项目中,就显得比较重要了,因为其优越的可控性,可是极大的提升线程的效率。

目前只是根据官网,ES6规范,大站等总结出来的,但是很遗憾,目前我们的项目中由于node项目较简单,并不需要进行实际改造。

如果需要实例的话,可参考github上的一些python后端项目,调用方式稍有不同,由于js参考的python语言,他们又同为动态语言,所以原理都是相同的,用处也一样。

阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),JS单线程避免阻塞方法:

1.sleep()方法:sleep()允许指定以毫秒为单位的一段时间作为参数,使得线程在指定的时间内进入阻塞状态,不能得到CPU时间,指定的时间一过,线程重新进入可执行状态。

典型地,sleep()被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后重新测试,直到条件满足为止。

2.suspend()和resume()方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume()被调用,才能使得线程重新进入可执行状态。

suspend()和resume()被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用resume()使其恢复。

3.yield()方法:yield()使得线程放弃当前分得的CPU时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得CPU时间。调用yield()的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。

4.wait()和notify()方法:两个方法配套使用,wait()使得线程进入阻塞状态,有两种形式,一种允许指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的notify()被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的notify()被调用。