function callByTimeouts(handler, timeouts) {
var startTime = Date.now();
var currentIndex = 0;
var timer = setInterval(function () {
var currentTime = Date.now();
var nextCallTime = startTime + timeouts[currentIndex];
if (currentTime < nextCallTime) return;
handler();
var nextIndex = currentIndex + 1;
if (nextIndex < timeouts.length) {
currentIndex = nextIndex;
} else {
clearInterval(timer);
}
}, 100);
}
callByTimeouts(function () {
console.log('qwerty');
}, [1000, 2500, 7500]);
function Mock() {
this.val = 'val';
this.log = {
start: function() {
this.log.timer = setInterval(function() {
console.log(this.val);
}.bind(this), 1000);
}.bind(this),
stop: function() {
clearInterval(this.log.timer);
delete this.log.timer;
}.bind(this)
};
}
function Timer(handler, interval) {
this.handler = handler;
this.interval = interval;
}
Timer.prototype.start = function () {
this.timer = setInterval(this.handler, this.interval);
};
Timer.prototype.stop = function () {
clearInterval(this.timer);
delete this.timer;
};
function Mock() {
this.val = 'val';
this.log = new Timer(function () {
console.log(this.val);
}.bind(this), 1000);
}
class Element {
constructor() {
this._events = {};
}
addEventListener(event, listener) {
let listeners = this._events[event];
if (!listeners) {
listeners = this._events[event] = [];
}
listeners.push(listener);
}
removeEventListener(event, listener) {
const listeners = this._events[event];
if (listeners) {
const index = listeners.indexOf(listener);
if (index !== -1) {
listeners.splice(index, 1);
}
}
}
dispatchEvent(event) {
const listeners = this._events[event];
if (listeners) {
for (let listener of listeners) {
listener(event);
}
}
}
}
res[0].error = errors;
выполняется раньше обработки уникальных логинов. Чтобы работало правильно нужно отложить работу с ошибками до момента исполнения всех запросов к БД:User.prototype.join = function (user, res) {
var errors = [],
unique = [];
for (var i = 0; i < user.length; i++) {
if (user[i].required && !user[i].value) {
errors.push('Вы не ввели логин');
}
if (user[i].unique) {
var query = pg.any('SELECT id FROM users WHERE login=$1', [user[i].value]).then(function (user) {
if (user.length) {
errors.push('Пользователь с таким логином уже зарегистрирован');
}
});
unique.push(query);
}
}
return Promise.all(unique).then(function () {
res[0].error = errors;
});
};
// неправильно
join(user, res);
// дальнейшая обработка res
// правильно
join(user, res).then(function () {
// дальнейшая обработка res
});
(function (i) { ... })(i);
в изначальном варианте бессмысленна, потому я её убрал. А if (user[i].unique == true) {
идентично if (user[i].unique) {
.this.parent.appendChild(text);
text всегда является ссылкой на элемент span, который был создан при объявлении объекта list. Если применять appendChild к одному и тому же элементу, он будет каждый раз переносить его из старого места на новое. Исходя из вашей задачи вам нужно создавать в каждой итерации новый элемент. Тоже самое относится и к input'у. row.addEventListener('click', function () {
// any code
}, false);
var m1 = [['Euroshop', 2500, 7500], ['Euroshop', 2500, 7500], ['Tur', 2500, 7500]],
m2 = [],
helper = {};
for (var i = 0; i < m1.length; i++) {
var name = m1[i][0],
data = m1[i].slice(1);
if (name in helper) {
helper[name][0] += data[0];
helper[name][1] += data[1];
} else {
helper[name] = data;
}
}
for (var key in helper) {
m2.push(key, helper[key][0], helper[key][1]);
}
console.log(m2);