Существует общепринятый стиль написания асинхронных апи, где первым аргументом передается объект с данными, а последним — колбек:
function map( collection, callback ){
for(var field in collection){
callback( collection[field] );
}
}
function first( items, count ){
return items.slice(0, count - 1);
}
function mapFirstTwo( items ){
return map(items, function(item){
return first(item, 2);
})
}
В функциональном стиле принято первым аргументом передавать калбек, а последним данные.
В таком случае мы можем используя каррирование и композицию избежать вложенных колбеков:
var map = curry(function( callback, collection ){
for(var field in collection){
callback( collection[field] );
}
});
var first = curry(function( count, items ){
return items.slice(0, count - 1);
});
var mapFirstTwo = map( first (2) );
Как вам такой подход? И библиотечка
https://github.com/quadroid/use-function-first