getProfile().then(function(profile) {
}, function (error) {
});
function getProfile(id) {
var deferred = $.Deferred();
someCodeThatSendRequest({
route: 'getProfile',
id: id
}, function (response) {
// preprocess response
deferred.resolve(response);
})
return deferred.promise();
}
$result = preg_replace_callback($regexp, function ($matches) {
// за вот это место не ручаюсь, тут уж сами
return str_replace($matches[2]. Compressor::minifyJS($matches[2]), $matches[0]);
}, $text)
function isSame(a, b) {
if (a.length > b.length) {
b = [a, a = b][0]; //swap
}
for(var i = 0, length = a.length;i<length;i++) {
if (-1 === b.indexOf(a[i])) {
return false;
}
}
return true;
}
// обработчик вешается на файловый инпут
document.getElementById('upload').addEventListener('change', function(e) {
var file = this.files[0];
var xhr = new XMLHttpRequest();
xhr.file = file; // not necessary if you create scopes like this
xhr.addEventListener('progress', function(e) {
var done = e.position || e.loaded, total = e.totalSize || e.total;
console.log('xhr progress: ' + (Math.floor(done/total*1000)/10) + '%');
}, false);
if ( xhr.upload ) {
xhr.upload.onprogress = function(e) {
var done = e.position || e.loaded, total = e.totalSize || e.total;
console.log('xhr.upload progress: ' + done + ' / ' + total + ' = ' + (Math.floor(done/total*1000)/10) + '%');
};
}
xhr.onreadystatechange = function(e) {
if ( 4 == this.readyState ) {
console.log(['xhr upload complete', e]);
}
};
xhr.open('put', url, true);
xhr.setRequestHeader("Content-Type","multipart/form-data");
xhr.send(file);
}, false);
Разработчики linkedIn как-то публиковали описание подходов по оптимизации бесконечных скролов, которые они у себя применяли:
http://engineering.linkedin.com/linkedin-ipad-5-techniques-smooth-infinite-scrolling-html5
а фэйсбук не самый хороший пример оптимизации фронтэнда.
p.s. по поводу ангуляра и делигированных событий, у меня в некоторых частях проекта используется всплытие ивентов вместо непосредственной привязки к элементу. Делается это у меня через 2 директивы (fsDelegate, и далее всякие обработчики ивентов аля fsTap и т.д). Причем fsDelegate вешает обработчики на элемент списка, fsTap регистрируется у fsDelegate (если конечно оно там будет, связь между ними через контроллер fsDelegate и параметр require: '^?fsDelegate'). Опять же при отлове события определяется какой именно элемент отработал, берется его скоуп и выполняется выражение заключенное в fsTap.
Все сервера предназначенные для больших нагрузок являются асинхронными. То есть обработка новых входящих соединений происходит раньше, чем закончат работу текущие соединения.
Преимущество готовых асинхронных серверов в том, что они готовы. Вы можете точно так же написать асинхронный сервер на php (socket + select), но это не настолько эффективно как в python и тем более в node.js, где этот функционал идет из коробки.
Стандартный кейс применения node.js/Python twisted и любых других реализаций - обработка либо сырых tcp-соединений (например push уведомления) или же keep-alive для тех же целей. При обработке же коротких http запросов профит уже не так велик. Во всяком случае между php и python. node.js будет пошустрее, но и памяти он будет кушать чуточку больше.