Pot.js と PotLite.js で利用可能。
引数 max を最大数とし、max 回、ループ処理を実行します。
引数 max を最大数として、最大 max 回、コールバック関数 callback を実行します。
処理は、for 文、もしくは for-of のように実行されます。
引数 context が指定されると、callback 関数の this が context にとって代わります。
例えば、10 回繰り返し処理を行うとすると
for (var i = 0; i < 10; i++) { debug(i); }
Pot.repeat(10, function(i) { debug(i) });
この 2 つの例の出力結果は同じになります。
引数 max には、数値以外にオブジェクトを渡すことができます。
var result = []; Pot.repeat({begin: 0, end: 100, step: 10}, function(i) { result.push(i); }); debug(result); // [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
引数 max をオブジェクトで指定する場合: begin : {Number} 開始する数値。省略時は 0 になります。 step : {Number} 1 ループごとのステップ。省略時は 1 になります。 end : {Number} 終了する数値。省略時は 0 になります。
これらを指定することで、例えば 重い for 文を Pot.Deferred.repeat に置き換える際に役立ちます。
コールバック関数の引数は以下のようになります。
function (i, last, loops) { this === context } i : {Number} step or 0 から始まって 1 ずつ繰り上がる/繰り下がる数値 last : {Boolean} ループの最後なら true になる値 loops : {Object} ループに関する情報
処理は 同期処理、非同期処理、それぞれ異なります。
callback 関数の中で StopIteration (Pot.StopIteration) を throw することでループを止められます。
Pot.Deferred.repeat.slow()
のようにして速度の指定ができます。
非同期では、ほとんどの環境で速度指定が可能ですが、
同期での速度指定は一部の環境 (XUL 上など) のみになります。
指定できる名前は以下の表を参照ください。
デフォルトの速度は normal です。
値 / メソッド名 | 速度 |
limp | 最も遅い |
doze | 遅い |
slow | 遅め |
normal | 通常 |
fast | 速め |
rapid | 速い |
ninja | 最も速い |
戻り値はありません。
Pot.repeat で同期処理の例:
var result = []; Pot.repeat(10, function(i) { result.push(i); }); debug(result); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
// コールバック第二引数 last を利用した例 var string = ''; var chars = 'abcdef'.split(''); Pot.repeat(chars.length, function(i, last) { string += chars[i] + '=' + i + (last ? ';' : ','); }); debug(string); // 'a=0,b=1,c=2,d=3,e=4,f=5;'
// オブジェクトで指定した例 var result = []; Pot.repeat({begin: 0, end: 100, step: 10}, function(i) { result.push(i); }); debug(result); // [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
Pot.Deferred.repeat で非同期処理の例:
var result = []; Pot.Deferred.repeat(10, function(i) { result.push(i); }).then(function() { debug(result); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] });
// コールバック第二引数 last を利用した例 var string = ''; var chars = 'abcdef'.split(''); Pot.Deferred.repeat(chars.length, function(i, last) { string += chars[i] + '=' + i + (last ? ';' : ','); }).then(function() { debug(string); // 'a=0,b=1,c=2,d=3,e=4,f=5;' });
// オブジェクトで指定した例 var result = []; Pot.Deferred.repeat({begin: 0, end: 100, step: 10}, function(i) { result.push(i); }).then(function() { debug(result); // [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] });
Pot.Deferred.prototype.repeat で非同期処理の例:
var result = []; var d = new Pot.Deferred(); d.then(function() { return 10; }).repeat(function(i) { result.push(i); }).then(function() { debug(result); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] }).begin();
// コールバック第二引数 last を利用した例 var string = ''; var chars = 'abcdef'.split(''); var d = new Pot.Deferred(); d.repeat(function(i, last) { string += chars[i] + '=' + i + (last ? ';' : ','); }).then(function() { debug(string); // 'a=0,b=1,c=2,d=3,e=4,f=5;' }).begin(chars);
// オブジェクトで指定した例 var result = []; Pot.Deferred.begin(function() { return { begin : 0, end : 100, step : 10 }; }).repeat(function(i) { result.push(i); }).then(function() { debug(result); // [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] });