标签:第一个 prot python语言 判断 其他 后端 完成 ref 16px
yield是ES6的新
关键字使生成器函数执行暂停,yield
关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return
关键字。
yield
关键字实际返回一个IteratorResult
对象,它有两个属性,value
和done
。value
属性是对yield
表达式求值的结果,而done
是false
,表示生成器函数尚未完全完成。一旦遇到 yield
表达式,生成器的代码将被暂停运行,直到生
成器的 next()
方法被调用。每次调用生成器的next()
方法时,生成器都会恢复执行,直到达到以下某个值: yield
,导致生成器再次暂停并返回生成器的新值。 下一次调用next()
时,在yield
之后紧接着的语句继续执行。throw
用
于从生成器中抛出异常。这让生成器完全停止执行,并在调用者中继续执行,正如通常情况下抛出异常一样。到达生成器函数的结尾;在这种情况下,生成器的执行结束,并且IteratorResult
给调用者返回undefined
并且done
为、
true
。到达return
语句。在这种情况下,生成器的执行结束,并将IteratorResult
返回给调用者,其值是由return
语句指定的,并且done
为true
。如果将参数传递给生成器的next()
方法,则该值将成为生成器当前yield
操作返回
的值。在生成器的代码路径中的yield
运算符,以及通过将其传递给Generator.prototype.next()
指定新的起始值的能力之间,生成器提供了强大的控制力。
{ value: 7, done: false }
{ value: undefined, done: true }
因为在while判断中的next也会进行消耗,导致输出结果与预期不符,得到的只是符合条件的偶数项
在js中,虽然借鉴了python的函数,但是也进行了自己的改造,由于没有send()函数,所以无法直接传递yield的值。
next()可以带一个参数,该参数会被认为是上一个yield整体的返回值,稍后将在代码中展示。
在某种程度上,next()可以直接当做send()使用
它的意义在于,可以在不同阶段从外部直接向内部注入不同的值来调整函数的行为(这一点是其他循环很难做到的,或要付出较大的代价才可以做到)
如果刚才没有让你有一个清晰的认识,那么这个例子一定会让你彻底明白的
next() 传参是对yield整体的传参,否则yield类似于return
在前端项目中,用的机会很少,完全可以忽略他的存在,但是在后台项目中,就显得比较重要了,因为其优越的可控性,可是极大的提升线程的效率。
目前只是根据官网,ES6规范,大站等总结出来的,但是很遗憾,目前我们的项目中由于node项目较简单,并不需要进行实际改造。
如果需要实例的话,可参考github上的一些python后端项目,调用方式稍有不同,由于js参考的python语言,他们又同为动态语言,所以原理都是相同的,用处也一样
标签:第一个 prot python语言 判断 其他 后端 完成 ref 16px
原文地址:https://www.cnblogs.com/whx123/p/12103316.html