次の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());
おまけ:可変配列の削除。