javascript - Node.js 迭代器接口(interface)

标签 javascript node.js iterator

我正在阅读关于 Iterators and generators 的 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);
}

但是我明白了:

low
high
__iterator__

它应该返回的地方:

3
4
5

是否可以在 Node.js 中按预期实现它?

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

** 编辑 **

我还应该注意,我知道 __iterator__ 是一个 Mozilla-feature only .我想知道 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);
});

还有其他选择吗?

最佳答案

我认为你的代码有一个错误,你写的是 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);
}

关于javascript - Node.js 迭代器接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22072926/

相关文章:

javascript - 使用 bxslider 旋转动态内容和图像不起作用

javascript - 如何获取回调函数的所有参数

javascript - 关于 Angular 中的位置更改

node.js - 如何在具有不同域的同一 IP/服务器上托管多个 Node.js 站点?

Java 字典迭代器类型问题

javascript - CSS 过渡只能在 FF 和 Chrome 中工作一次

Node.js/Socket.io 网络应用程序在本地完美且无限期地工作,但浏览器在 Heroku 上挂起

c++ - 避免模​​板参数中迭代器类型的累积

python - 如何让生成器/迭代器在耗尽时评估为 False?

javascript - Node 模块回调中的返回变量