Эту задачу можно понимать по разному.
В простейшем варианте вы вызываете следующую функцию из runCallback когда закончилась предыдущая.
Но можно и такое изобразить:
function stream(log, ...args) {
let index = 0;
const results = new Map();
const callback = (i, result) => {
if(i === index) {
while(true) {
log(result);
if(!results.has(++index))
break;
result = results.get(index);
results.delete(index);
}
} else {
results.set(i, result);
}
};
args.forEach((func, i) => func(result => callback(i, result)));
}
stream(runCallback, one, two, three)
получив максимальную возможную скорость вызовов.