Generator 是 ES6 中新增的一个重要特性,在 JavaScript 编程中使用起来非常灵活,可以让我们更加方便地实现异步编程。ES9 中新增了一些有用的方法,本文将对这些方法进行详解。
什么是 Generator?
Generator 是一种特殊的函数,它可以通过 yield 关键字把函数的执行权交出去,然后再次执行时从上次离开的地方继续执行。这使得在一个生成器函数中,我们可以控制异步操作的执行顺序。
下面是一段简单的 Generator 的示例代码:
-- -------------------- ---- ------- --------- ----- - --------------------- ----- ------ ---------------------- ----- ------ ------------------- - ----- ----- - ------ -------------------------- -- - ------ ------ ----- ----- - -------------------------- -- - ------ ------ ----- ----- - -------------------------- -- - ------ ---------- ----- ---- -
在这个例子中,我们定义了一个 foo 生成器函数,并在其中使用了 yield 语句。通过调用 foo() 函数返回的 Generator 对象(myGen),我们可以对该生成器进行逐步迭代(通过 next 方法),并在每个 yield 语句出暂停执行,以及在下一次迭代时从上次离开的地方继续执行。
ES9 Generator 新增方法
除了基本的 yield 语句,ES6 还提供了许多有用的方法用于控制 Generator 函数的行为。ES9 在这方面做了更多的增强,让我们更好的利用 Generator 函数。
下面是我们将会详细讨论的 ES9 Generator 新增方法:
- Generator.prototype.return()
- Generator.prototype.throw()
- Generator.prototype.return() 的例外情况
Generator.prototype.return()
Generator.prototype.return() 方法可以用于提前结束一个生成器函数。通常这个方法被用作释放资源或者清理某些状态的操作。它接受一个可选的参数,作为要结束生成器的返回值。
-- -------------------- ---- ------- --------- ----- - --- - --------------------- ----- ------ ---------------------- ----- ------ ------------------- - ----- --- - ------------------------- - - ----- ----- - ------ -------------------------- -- - ------ ------ ----- ----- - --------------------------------- -- - ------ ------ ----- ---- -
在这个示例代码中,我们在第三个迭代中调用了 myGen.return() 方法,并传递了一个字符串 'end' 作为返回值。这会立即将生成器标记为完成并返回,并且不会执行后面的代码,因为控制流已经在 return() 调用时被交出去了。
Generator.prototype.throw()
Generator.prototype.throw() 方法与 return() 方法类似,也是一种用于处理终止生成器的方法。不过它可以让我们通过 throw 语句中的异常控制流。也就是说,Generator.prototype.throw() 方法可以在生成器的函数执行上下文中抛出异常。
-- -------------------- ---- ------- --------- ----- - --- - --------------------- ----- ------ ---------------------- ----- ------ ------------------- - ----- --- - ------------------------- - - ----- ----- - ------ -------------------------- -- - ------ ------ ----- ----- - --------------------------- ---------------- ---------- -- ------ --------- -----
在这个示例代码中,我们在第三个迭代中调用了 myGen.throw() 方法,并传递了一个 Error 对象作为参数。这会立即终止生成器,并在第 9 行中的 catch 处理抛出的异常。
Generator.prototype.return() 的例外情况
当调用 return() 方法时,如果生成器函数中存在 finally 代码块,则 finally 代码块中的代码会先于 return() 方法中的返回值完成执行。也就是说,finally 中的代码不会影响 return() 方法的返回值,但是它可以执行一些清理工作。
-- -------------------- ---- ------- --------- ----- - --- - --------------------- ----- ------ ---------------------- ----- ------ - ------- - ----------------------- - - ----- ----- - ------ -------------------------- -- - ------ ------ ----- ----- - --------------------------------- -- -------- - ------ ------ ----- ---- -
在这个示例代码中,我们在最后一个迭代中调用了 myGen.return() 方法,并传递了一个字符串 'end' 作为返回值。在调用 return() 方法之前,最后一个 yield 语句执行完后会立即执行 finally 代码块中的代码。执行完 finally 后, return() 才会返回,并且返回的值为 { value: 'end', done: true }。
总结
ES9 中新增的 Generator.prototype.return()、Generator.prototype.throw() 方法以及 Generator.prototype.return() 方法异常情况的处理,让我们在使用 Generator 函数的过程中更加详细和灵活。利用这些方法,我们能够更好的管理异步编程中的状态,提高代码质量与效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6476f7c3968c7c53b038da35