var cache_ = {},
Class = require('atma-class');
function getUserData(id, callback) {
var dfr = cache_[id];
if (dfr == null) {
// делеаем запрос только с первым вызовом функции с этим id
dfr = cache_[id] = new Class.Deferred();
vk.api('users.get', {
'user_ids': id,
'fields': 'photo_100'
}, function(err, result) {
if (err)
return dfr.fail(err);
dfr.resolve(result.response[0]);
});
}
// подписываемся на окончание загрузки, если же
// загрузка уже завершилась(успешно или нет),
// то callback вызывается сраюу
dfr
.done(function(response) {
callback(null, response)
})
.fail(callback);
}
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();
}
var slice = Array.prototype.slice,
filter = Array.prototype.filter
;
function findSelector(cssProperty){
var rules = [];
filter
.call(document.styleSheets, hasRules)
.forEach(function(styleSheet){
rules = rules.concat(slice
.call(styleSheet.rules)
.filter(hasCssNameDelegate(cssProperty))
);
})
return rules.map(function(rule){
return {
selector: rule.selectorText,
value: rule.style[cssProperty]
};
});
function hasRules(styleSheets){
return styleSheets.rules != null
}
function hasCssNameDelegate(name) {
return function(cssRule){
return cssRule.style && slice.call(cssRule.style).indexOf(name) !== -1
};
}
}
function findSelectorForElement(element, cssProperty){
var matchesSelector = HTMLElement.prototype.webkitMatchesSelector
|| HTMLElement.prototype.mozMatchesSelector
|| HTMLElement.prototype.msMatchesSelector
|| HTMLElement.prototype.oMatchesSelector
;
return findSelector(cssProperty)
.filter(function(data){
return matchesSelector.call(element, data.selector);
}).slice(-1)[0];
}
var tosterSidebar = document.querySelector('.sidebar')
findSelectorForElement(tosterSidebar, 'width');
function App(){
// `data` тоже в прототип можно вынести
}
App.prototype = {
data: 'Привет ',
method: function(name){
alert(this.data + ', ' + name + '!');
}
};
var app = new App();
app.method('Маша');
<span id='icon' data-src='../image.png'></span>
#icon { content: url(data-src); /* ... */ }
$('#icon').data('../baz.png');
$('style').text('#icon:before { content: url(baz.png); }').appendTo('body')
sql_values = a
.reduce(function(aggr, x){
if (x.enabled)
aggr.push(x.value)
return aggr;
}, [])
.join(', ')
;
function find(title, poll, parent){
parent = parent || poll;
if (poll.title === title)
return parent;
var result;
poll.reply && poll.reply.some(function(reply){
return reply.poll && (result = find(title, reply.poll, poll)) || false;
});
return result;
}
find('Вопрос 2', mass.poll);
function changeDelegate(diff) {
return function(event) {
var $count = $(this)
.parent('div')
.children('.count')
,
mc = $count.text();
$count.text(parseInt(mc, 10) + diff);
};
}
$('.plus')
.click(changeDelegate(1));
$('.minus')
.click(changeDelegate(-1));
var Validations = {
number: function(val) {
return typeof val === 'number';
}
};
function AbstractModel() {
for (var field in this.fields)
Object.defineProperty(this, field, createAccessor(field));
}
function createAccessor(field) {
var private_;
return {
get: function() {
return private_;
},
set: function(value) {
if (Validations[this.fields[field]](value))
private_ = value;
},
enumerable: true,
configurable: true
}
}
// usage
function FooModel() {
AbstractModel.call(this);
}
FooModel.prototype = {
fields: {
age: 'number'
}
};
var foo = new FooModel;
foo.age = 'test1';
console.log('>>', foo.age); // >> undefined
foo.age = 10;
foo.age = 'test2'
console.log('>>', foo.age); // >> 10
$.fn.pluginName = function(handler) {
var self = this;
$(document)
.on('change', function(event) {
if (self.index(event.target) === -1)
return;
handler(event);
});
return this;
};
`Валидаторы и Нормализаторы`. Первое - обычно, для каждой модели у нас отдельный entity (класс) с валидаторами, а так же при получение данных, в пост запросе например, мы их нормализуем - вот похожий ответ.
Это популярная проблема, все пытаются с ней бороться, придумывают разные инструменты, библиотеки и прочее. Но скажу, что при хорошей архитектуре вложенность функций редко переваливает за 2 штуки - а это уже никакой не `хэл`. Ну вот посмотрите на метод в котором у вас этот самый `хэл`. Это же явное нарушение SOLID - один метод обрабатывает данные, куда-то их посылает, ждет в коллбэке ответ, с ним что-то делает, потом снова вызывает другую асинхронную функцию и опять ждет ответ, и так несколько раз. Поэтому `коллбэк хэл` - это классная штука, которая помогает разбивать код на независимые функции - принял данные, что-то сними сделал, отправил дальше как эти данные, так и другие аргументы. Точка.
// ..
top: orig.touches[0].pageY - offset.y,
left: orig.touches[0].pageX - offset.x
var i = 10e4; while(--i) clearInterval(i);