1

次のzip関数(特にinvoke関数)をより機能的にする方法を理解しようとしています。私が抱えている問題は、呼び出しメソッドが値をディスパッチする前に、左側と右側の両方が満たされるのを待たなければならないことです。正しい値が圧縮されるように値を順番に呼び出す必要があります。それ以外の場合は、これを満たすためにカレー/部分関数を検討します。

この障害を取り除くために使用できるものはありますか。

function zip(state, a, b) {
    var left = [];
    var right = [];

    function invoke() {
        if (left.length > 0 && right.length > 0) {
            state([left.shift(), right.shift()]);
        }
    }

    a.foreach(function(v) {
        left.push(v);
        invoke();
    });

    b.foreach(function(v) {
        right.push(v);
        invoke();
    });
}

以下は、zip 関数を満たす単純な例です。

function Stream() {
    var env = this;
    env.subs = [];
    env.id = setInterval(function() {
        env.subs.forEach(function(f) {
            f(Math.random()); 
        });
    }, ((Math.random() * 100) + 500) | 0);
}
Stream.prototype.foreach = function(f) {
    this.subs.push(f);
}
zip(function(v) {
    console.log(v);
}, new Stream(), new Stream());

おまけ:可変配列の削除。

4

3 に答える 3

1

コードをより機能的にしたい理由がわかりません。それでも、関数を完全にzip削除することで、関数を改善しました。invokeあなたは本当にそれを必要としません:

function zip(a, b, callback) {
    var left = [], right = [];

    a.forEach(function (value) {
        if (right.length)
            callback([value, right.shift()]);
        else left.push(value);
    });

    b.forEach(function (value) {
        if (left.length)
            callback([left.shift(), value]);
        else right.push(value);
    });
}

自分で出力を参照してください: http://jsfiddle.net/Tw6K2/

コードは機能的というよりは必須です。しかし、これより良くなるとは思えません。

于 2013-07-01T15:56:34.580 に答える