Выполнение всех аргументов функции по порядку перед вызовом
Я пытаюсь понять, как сделать следующую функцию zip (особенно функцию invoke) более функциональной. Вопрос яМы получили то, что метод 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());
Бонус: удаление изменяемого массива.