var express = require('express');
var app = express();
app.get('/user/:user', function(req, res) {
var user = req.params.user;
// Тут дожны быть проверки
// прав клиента на просмотр
// запрашиваемых данных.
// запросы в бд за данными пользователя,
// и другими необходимыми данными.
// затем для пользователя
// указанного в запросе формируются
// данные для отдачи клиенту
// это могут быть как именно данные,
// например в формате json так и страница
// (частично и полностью)
// затем эти данные отдаются клиенту:
res.send(data);
});
var _Seconds = $('.timer').text(),
var _Clicks = 0; // счетчик кликов
int;
int = setInterval(function() { // запускаем интервал
if (_Seconds - _Clicks > 1) {
_Seconds--; // вычитаем 1
$('.timer').text(_Seconds - _Clicks); // выводим получившееся значение в блок
} else {
clearInterval(int); // очищаем интервал, чтобы он не продолжал работу при _Seconds = 0
$('.div_x').addClass('xxx'); //добавляем класс на элемент 1
$('.div_y').addClass('yyy'); //добавляем класс на элемент 2
}
}, 1000);
var options = {
url: url,
encoding: null,
timeout: 60*1000
};
function req(opts, cb){
var isTimeout = false;
setTimeout( ()=>{
if( isTimeout) return;
isTimeout = true;
cb("time is out", {});
}, opts.timeout);
request.get(opts, function (err, res) {
// сюда не попадает уже.. ;) виснет на запросе.
if( isTimeout ) return;
isTimeout = true;
cb(err, res);
});
)
// выполняем запрос с таймаутом в 60 сек.
req(options, function(err, res){
if (err) {
console.log('не ok');
} else {
console.log('ok');
}
});
var express = require('express');
var router = express.Router();
// middleware that is specific to this router
router.use(function timeLog(req, res, next) {
console.log('Time: ', Date.now());
next();
});
// define the home page route
router.get('/', function(req, res) {
res.send('Birds home page');
});
// define the about route
router.get('/about', function(req, res) {
res.send('About birds');
});
module.exports = router;
...
var birds = require('./birds');
...
app.use('/birds', birds);
...
...
var chat = require('./routers/chat/main.js');
...
app.use('/chat, chat);
...
function sum(arr) {
var val = arr.pop();
if( !val ) return 0;
if( Array.isArray(val)) return sum(val) + sum(arr);
return val + sum(arr);
}
let array = [];
// так как sum_2 уничтожает исходный массив, для адекватности
// добавил переинициализацию массива исходных данных
function sum_1(arr) {
if (!arr.length) {
return 0;
}
let val = arr[0];
if (val instanceof Array) {
val = sum_1(val);
}
return val + sum_1(arr.slice(1));
}
function sum_2(arr) {
var val = arr.pop();
if (!val) return 0;
if (Array.isArray(val)) return sum_2(val) + sum_2(arr);
return val + sum_2(arr);
}
console.time('init array');
for (let i = 0; i < 1000; i++) {
array = [
[1, 4],
[11],
[3, 5, 7]
];
}
console.timeEnd('init array');
console.time('eval');
for (let i = 0; i < 1000; i++) {
array = [
[1, 4],
[11],
[3, 5, 7]
];
eval(JSON.stringify(array).replace(/[^\d]+/g, '+') + '0') // 31
}
console.timeEnd('eval');
console.time('sum recursion 1');
for (let i = 0; i < 1000; i++) {
array = [
[1, 4],
[11],
[3, 5, 7]
];
sum_1(array);
}
console.timeEnd('sum recursion 1');
console.time('sum normal');
for (let i = 0; i < 1000; i++) {
array = [
[1, 4],
[11],
[3, 5, 7]
];
[].concat.apply([], array).reduce(function(res, item) {
return res + item;
})
}
console.timeEnd('sum normal');
console.time('sum recursion 2');
for (let i = 0; i < 1000; i++) {
array = [
[1, 4],
[11],
[3, 5, 7]
];
sum_2(array);
}
console.timeEnd('sum recursion 2');
bubbles: true
- подробно тутdetail: +vote
- по всей видимости увеличение счетчика голосования/**
* функция реализует логику "компонента" voter. Используется так:
* var voter = new Voter({
* elem: document.getElementById('voter')
* });
* @param {object} options объект с параметрами, может содержать ключи
* - elem ссылка на html элемент, содержащий в
* себе кнопки уменьшения (html элемент с css
* классом class="down") и увеличения (html
* элемент с css классом class="up") а также
* элемент отображения текущего состояние (html
* элемент с css классом class="vote")
*
*/
function Voter(options) {
// делаем ссылку на html элемент короче, чтобы не писать везде options.elem
var elem = options.elem;
// получаем дочерний элемент '.vote'
var voteElem = elem.querySelector('.vote');
// устанавливаем для 'компонента' voter обработчик события 'click'
elem.onclick = function(event) {
if (event.target.closest('.down')) {
// если клик был по дочернему элементу '.down'
voteDecrease();
} else if (event.target.closest('.up')) {
// если клик был по дочернему элементу '.up'
voteIncrease();
}
}
// устанавливаем для 'компонента' voter обработчик события 'onmousedown'
elem.onmousedown = function() {
return false;
};
// ----------- методы -------------
// функция уменьшает значение в дочернем элементе '.vote' на единицу
function voteDecrease() {
setVote(+voteElem.innerHTML - 1);
// где:
// +voteElem.innerHTML - приведение строки voteElem.innerHTML к числу
// +1 - добавляем 1 :)
}
// функция увеличивает значение в дочернем элементе '.vote' на единицу
function voteIncrease() {
setVote(+voteElem.innerHTML + 1);
// где:
// +voteElem.innerHTML - приведение строки voteElem.innerHTML к числу
// +1 - добавляем 1 :)
}
// функция устанавливает дочернему элементу '.vote' значение равное
// числу, переданному в параметре vote
function setVote(vote) {
voteElem.innerHTML = +vote;
// создаем кастомный объект содержащий данные о событии
var widgetEvent = new CustomEvent(
// указываем имя кастомного событие "change".
"change",
// передав в качестве параметровнего данные о событии
{
bubbles: true, // тут расписано https://learn.javascript.ru/event-bubbling#vsplytie
detail: +vote // поле detail кастомного объекта события widgetEvent. Содержит текущее значение счетчика (+vote приводит значение vote к числу)
}
);
// инициируем (вызываем) у "компонента" voter созданное событие "change"
// c параметром detail содержащим установленное количество голосов
elem.dispatchEvent(widgetEvent);
// данное событие в данном конкретном случае мы ловим в index.html:
// document.getElementById('voter').addEventListener('change', function(e) {
// alert(e.detail);
// });
};
// экспортируем функцию setVote в глобальное пространство имен
this.setVote = setVote;
}
function foo(a, b, c) {
if (arguments.length === 2) {
c = b;
b = undefined;
}
// ...
console.log(a,b,c);
}
foo("Ivan", "Ivanov", "Ivanovich");
foo("Ivan", "Ivanovich");