文章指出Generator常被误用于异步处理,其核心本质是实现Iterator接口。通过同步调用next方法,Generator可自然支持for-of循环与解构赋值,避免异步调用的复杂性。本文探讨Generator作为Iterator的正确使用方式,强调同步场景下的应用价值。
Generator与Iterator的核心关系
提到Generator,人们往往首先联想到异步编程,这或许受到某些非主流实践的影响。实际上,Generator与Iterator的关系更为紧密。利用Generator处理异步逻辑,可能是受C#开发者思路启发,尽管这种用法存在完整体系,但个人并不推荐。强行将Generator与异步绑定,核心在于next方法的调用时机,因为next支持异步调用,导致Generator被用于异步场景。然而,next方法虽可异步调用,更恰当的方式是同步执行。例如,当Generator实例用于for-of循环或数组解构时,next方法是连续同步调用的。除了next的同异步问题,其参数传递也值得注意。next调用时传入的参数会作为yield运算符的返回值,从而丰富Generator的使用场景。早期Python中yield是语句,不存在此类用法,后续版本将yield改为运算符后,才衍生出各种复杂情况。将Generator实例作为Iterator使用时,既不会异步调用next,也不向next传参,这应被视为Generator的正确用法。简言之,Generator旨在实现Iterator接口,其名称并无其他隐含意义。以下是一个基础示例: 运行
<script>
var match = function * (pattern, string) {
var regexp = new RegExp(pattern, 'g');
for(let i; i = regexp.exec(string); yield i);
};
for(let i of match('a', 'abcabcabc')) {
console.log(i);
}
</script>