Pot.js と PotLite.js で利用可能。
Pot.Iter インスタンスや yield ジェネレータをイテレートします。
Pot.Iter インスタンス や、yield 演算子で生成したイテレータオブジェクトをイテレートします。
引数 iter には、Pot.Iter インスタンスや yield ジェネレータを指定します。
引数 callback は、任意にイテレートする関数を指定します。
引数 context が指定されると、callback 関数の this が context にとって代わります。
コールバック関数 callback の引数は以下のようになります。
function (value, key, object) { this === context }
value : {*} iter.next() の戻り値。イテレータによって変化します。
key : {*} iter.next() の戻り値。イテレータによって変化します。
object : {Object|*} object 自身。
例えば、以下のように [value, key] として返すと、 callback で value, key として得られます。
var iter = new Pot.Iter();
iter.next = (function() {
var chars = 'abcdef'.split('');
var i = 0;
return function() {
var result = [chars[i], i];
i++;
if (i >= chars.length) {
throw Pot.StopIteration;
}
return result;
};
})();
var string = '';
Pot.iterate(iter, function(value, key, object) {
string += value + key + ':';
});
debug(string); // 'a0:b1:c2:d3:e4:'
処理は 同期処理、非同期処理、それぞれ異なります。
callback 関数の中で StopIteration (Pot.StopIteration) を throw することでループを止められます。
Pot.Deferred.iterate.slow() のようにして速度の指定ができます。
非同期では、ほとんどの環境で速度指定が可能ですが、
同期での速度指定は一部の環境 (XUL 上など) のみになります。
指定できる名前は以下の表を参照ください。
デフォルトの速度は normal です。
| 値 / メソッド名 | 速度 |
| limp | 最も遅い |
| doze | 遅い |
| slow | 遅め |
| normal | 通常 |
| fast | 速め |
| rapid | 速い |
| ninja | 最も速い |
callback の最終的な戻り値が返ります。
Pot.iterate で同期処理の例:
// Pot.Iter インスタンスによるイテレートの例
var results = [];
var iter = new Pot.Iter();
iter.next = (function() {
var i = 0;
var end = 10;
return function() {
if (i >= end) {
throw StopIteration;
}
return i++;
};
})();
Pot.iterate(iter, function(i) {
results.push(i);
});
debug(results); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
// yield によるジェネレータを使用する例
var results = [];
var iter = (function() {
for (var i = 0; i < 10; i++) {
yield i;
}
})();
Pot.iterate(iter, function(i) {
results.push(i);
});
debug(results); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Pot.Deferred.iterate で非同期処理の例:
// Pot.Iter インスタンスによるイテレートの例
var results = [];
var iter = new Pot.Iter();
iter.next = (function() {
var i = 0;
var end = 10;
return function() {
if (i >= end) {
throw StopIteration;
}
return i++;
};
})();
Pot.Deferred.iterate(iter, function(i) {
results.push(i);
}).then(function() {
debug(results); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
});
// yield によるジェネレータを使用する例
var results = [];
var iter = (function() {
for (var i = 0; i < 10; i++) {
yield i;
}
})();
Pot.Deferred.iterate(iter, function(i) {
results.push(i);
}).then(function() {
debug(results); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
});
Pot.Deferred.prototype.iterate で非同期処理の例:
// Pot.Iter インスタンスによるイテレートの例
var results = [];
var iter = new Pot.Iter();
iter.next = (function() {
var i = 0;
var end = 10;
return function() {
if (i >= end) {
throw StopIteration;
}
return i++;
};
})();
var d = new Pot.Deferred();
d.then(function() {
return iter;
}).iterate(function(i) {
results.push(i);
}).then(function() {
debug(results); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}).begin();
// yield によるジェネレータを使用する例
var results = [];
var iter = (function() {
for (var i = 0; i < 10; i++) {
yield i;
}
})();
var d = new Pot.Deferred();
d.iterate(function(i) {
results.push(i);
}).then(function() {
debug(results); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}).begin(iter);
// Pot.Iter インスタンスによるイテレートの例 (2)
var results = [];
var iter = new Pot.Iter();
iter.next = (function() {
var i = 0;
var end = 10;
return function() {
if (i >= end) {
throw StopIteration;
}
return i++;
};
})();
Pot.Deferred.begin(function() {
return iter;
}).iterate(function(i) {
results.push(i);
}).then(function() {
debug(results); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
});