Pot.iterate

{*} Pot.iterate ({Pot.Iter|Object|*} iter [, {Function} callback [, {Object|*} context]])
{Pot.Deferred} Pot.Deferred.iterate ({Pot.Iter|Object|*} iter [, {Function} callback [, {Object|*} context]])
{Pot.Deferred} Pot.Deferred.prototype.iterate ([{Function} callback [, {Object|*} context]])

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:'

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

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

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]
});