Pot.js と PotLite.js で利用可能。
StopIteration が throw されるまで永久にループします。
StopIteration (Pot.StopIteration) が throw されるまで、永久に引数 callback をループ実行します。
引数 context が指定されると、callback 関数の this が context にとって代わります。
例えば、以下の 2 つの処理は同じ出力結果になります。
var end = 10;
var i = 0;
while (true) {
if (++i >= end) {
break;
}
debug(i);
}
var end = 10;
var i = 0;
Pot.forEver(function() {
if (++i >= end) {
throw Pot.StopIteration;
}
debug(i);
});
コールバック関数の引数は以下のようになります。
function (i) { this === context }
i : {Number} 0 から始まって各ループごとに 1 加算される数値。
Number.MAX_VALUE を超えると 0 に戻る。
処理は 同期処理、非同期処理、それぞれ異なります。
callback 関数の中で StopIteration (Pot.StopIteration) を throw することでループを止められます。
Pot.Deferred.forEver.slow() のようにして速度の指定ができます。
非同期では、ほとんどの環境で速度指定が可能ですが、
同期での速度指定は一部の環境 (XUL 上など) のみになります。
指定できる名前は以下の表を参照ください。
デフォルトの速度は normal です。
| 値 / メソッド名 | 速度 |
| limp | 最も遅い |
| doze | 遅い |
| slow | 遅め |
| normal | 通常 |
| fast | 速め |
| rapid | 速い |
| ninja | 最も速い |
戻り値はありません。
Pot.forEver で同期処理の例:
var string = '';
var abc = 'abc*';
Pot.forEver(function(i) {
string += i + ':' + abc;
if (string.length > 50) {
throw Pot.StopIteration;
}
});
debug(string); // '0:abc*1:abc*2:abc*3:abc*4:abc*5:abc*6:abc*7:abc*8:abc*'
Pot.Deferred.forEver で非同期処理の例:
var string = '';
var abc = 'abc*';
Pot.Deferred.forEver(function(i) {
string += i + ':' + abc;
if (string.length > 50) {
throw Pot.StopIteration;
}
}).then(function() {
debug(string); // '0:abc*1:abc*2:abc*3:abc*4:abc*5:abc*6:abc*7:abc*8:abc*'
});
Pot.Deferred.prototype.forEver で非同期処理の例:
var string = '';
var abc = 'abc*';
var d = new Pot.Deferred();
d.forEver(function(i) {
string += i + ':' + abc;
if (string.length > 50) {
throw Pot.StopIteration;
}
}).then(function() {
debug(string); // '0:abc*1:abc*2:abc*3:abc*4:abc*5:abc*6:abc*7:abc*8:abc*'
}).begin();
// 例 (2)
var string = '';
var abc = 'abc*';
var limit;
Pot.Deferred.begin(function() {
limit = 50;
}).forEver(function(i) {
string += i + ':' + abc;
if (string.length > limit) {
throw Pot.StopIteration;
}
}).then(function() {
debug(string); // '0:abc*1:abc*2:abc*3:abc*4:abc*5:abc*6:abc*7:abc*8:abc*'
});