Node.js迭代器接口

Yan*_*hon 6 javascript iterator node.js

我正在阅读关于迭代器和生成器的MDN指南,我实现了以下示例:

function Range(low, high){
  this.low = low;
  this.high = high;
}
Range.prototype.__iterator__ = function(){
  return new RangeIterator(this);
};

function RangeIterator(range){
  this.range = range;
  this.current = this.range.low;
}
RangeIterator.prototype.next = function(){
  if (this.current > this.range.high)
    throw StopIteration;
  else
    return this.current++;
};

var range = new Range(3, 5);
for (var i in range) {
  console.log(i);
}
Run Code Online (Sandbox Code Playgroud)

但我明白了:

low
high
__iterator__
Run Code Online (Sandbox Code Playgroud)

应该返回的地方:

3
4
5
Run Code Online (Sandbox Code Playgroud)

可以在Node.js中按预期实现吗?

注意:我正在使用node --harmony myscript.js.

**编辑**

我还应该注意到,我知道这__iterator__只是一个Mozilla功能.我想知道Node.js中的等价物是什么.或者什么是下一个最好的事情.

另外,我想不是因为我不想重复,将免收任何条件测试使用发电机这一点.

我的结论是,唯一的等价物是

Range.prototype.each = function (cb) {
  for (var i = this.low; i <= this.high; i++) {
     cb(i);
  }
};

//...
range.each(function (i) {
  console.log(i);
});
Run Code Online (Sandbox Code Playgroud)

还有替代品吗?

and*_*ndy 4

我认为你的代码有一个错误,你写的for (var i in range)而不是for (var i of range). 关键字in打印出对象的属性,您希望使用它of来实际获取迭代器值。

不管怎样,自从问题被提出以来,Node.js 现在有了更好的和谐支持。下面是一个更新的代码示例,它可以在 Node 4.2 上开箱即用。__iterator__ 名称已更改为 Symbol.iterator,并且不使用 StopIteration 异常。

"use strict";

function Range(low, high){
  this.low = low;
  this.high = high;
}
Range.prototype[Symbol.iterator] = function(){
  return new RangeIterator(this);
};

function RangeIterator(range){
  this.range = range;
  this.current = this.range.low;
}
RangeIterator.prototype.next = function(){
  let result = {done: this.current > this.range.high, value: this.current};
  this.current++;
  return result;
};

var range = new Range(3, 5);
for (var i of range) {
  console.log(i);
}
Run Code Online (Sandbox Code Playgroud)