Pot.forEver

{Void|*} Pot.forEver ({Function} callback [, {Object|*} context])
{Pot.Deferred} Pot.Deferred.forEver ({Function} callback [, {Object|*} context])
{Pot.Deferred} Pot.Deferred.prototype.forEver ({Function} callback [, {Object|*} context])

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 に戻る。

処理は 同期処理、非同期処理、それぞれ異なります。

  • Pot.forEver は同期処理になります。
    Pot.globalize() 適応済みの場合は forEver() で実行できます。
  • Pot.Deferred.forEver は非同期処理になり、Pot.Deferred のインスタンスを返します。
    Pot.globalize() 適応済みの場合は Deferred.forEver() で実行できます。
  • Pot.Deferred.prototype.forEver は、Pot.Deferred.prototype.async() によって 同期/非同期 が変化します。
    Pot.Deferred チェイン上で実行でき、Pot.Deferred のインスタンスを返します。

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*'
});