var Request = require('request'),
Class = require('atma-class');
module.exports = function prepareTiles(tiles, url, ssid, callback) {
var await = new Class.Await();
tiles.forEach(function(tile) {
prepareTile(tile, url, ssid, await.delegate());
});
await.always(function(){
callback(tiles);
});
};
function prepairTile(tile, url, ssid, callback) {
var meta = title.metadata;
switch (meta.tiletype) {
case 'mark':
var search = qs.stringify({
url: url,
ssid: ssid,
mark: meta.mark,
type: meta.type,
format: meta.format,
graph: meta.graph
});
val_resolve(
'http://127.0.0.1:8080/getSingleMark?' + search
, tile
, callback);
break;
case 'youtube':
case 'telcall':
case 'skypecall':
val_onComplete(tile, meta, callback);
break;
}
}
function val_resolve(url, tile, callback) {
Request.get(url, function(error, res, body) {
if (error)
console.error(error)
val_onComplete(tile, body, callback);
});
}
function val_onComplete(tile, model, callback) {
tile.metadata.value = tpl.make(
tile.metadata.tiletype, model
);
callback();
}
Это популярная проблема, все пытаются с ней бороться, придумывают разные инструменты, библиотеки и прочее. Но скажу, что при хорошей архитектуре вложенность функций редко переваливает за 2 штуки - а это уже никакой не `хэл`. Ну вот посмотрите на метод в котором у вас этот самый `хэл`. Это же явное нарушение SOLID - один метод обрабатывает данные, куда-то их посылает, ждет в коллбэке ответ, с ним что-то делает, потом снова вызывает другую асинхронную функцию и опять ждет ответ, и так несколько раз. Поэтому `коллбэк хэл` - это классная штука, которая помогает разбивать код на независимые функции - принял данные, что-то сними сделал, отправил дальше как эти данные, так и другие аргументы. Точка.
asyncFunction(args, function(error, result){})
auth.getUser(req, function(error,user) {
if (error != null){
handle(res,error);
return;
}
db.getData(function(error,data) {
if (error != null){
handle(res,error);
return;
}
res.write(template.render(data));
});