Erfüllen Sie alle Funktionsargumente in der angegebenen Reihenfolge, bevor Sie sie aufrufen

Ich versuche zu verstehen, wie die folgende Zip-Funktion (insbesondere die Aufruffunktion) funktionsfähiger gemacht werden kann. Das Problem ist, dass die Methode invoke warten muss, bis sowohl die linke als auch die rechte Seite gefüllt sind, bevor die Werte gesendet werden können. Die Werte müssen aufgerufen werden, damit die richtigen Werte gezippt werden, sonst würde ich eine Curry- / Partial-Funktion in Betracht ziehen, um dies zu erfüllen.

Gibt es irgendetwas, das ich gebrauchen könnte, um diese Behinderung zu beseitigen?

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

Der folgende Text ist ein einfaches Beispiel dafür, was die Reißverschlussfunktion erfüllt.

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());

Bonus: Veränderliches Array entfernen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage