class Q {
constructor() {
this.promise = Promise.resolve();
}
makePromise(cb) {
return new Promise(res => setTimeout(
() => {
cb();
res();
},
1e3
));
}
enqueue(cb) {
this.promise = this.promise
.then(() => this.makePromise(cb));
return this;
}
}
const cell = new Q();
cell.enqueue(() => console.log(1));
cell.enqueue(() => console.log(2));
cell.enqueue(() => console.log(3));
window.open()
не является прямым следствием действия пользователя: клика мышки, нажатия кнопки на клавиатуре. x = x + k * (xTarget - x);
y = y + k * (yTarget - y);
В этом ответе подробнее: Какой алгоритм подойдет для описания полета насекомого?const len1 = arr1.length;
const top2 = 2 * Math.floor((arr2.length - 2) / 2);
for (let id1 = 0, id2 = 0; id1 < len1; id1++, id2 = Math.min(top2, id2 + 2)) {
console.log(`name: ${arr1[id1]} val1: ${arr2[id2]} val2: ${arr2[id2 + 1]}`);
}
arr1
и arr2
, индексы по ним, соотв., хорошо назвать с теми же номерами: id1
и id2
function superCallback() {
console.log("Свершилось! Коллбэк сработал.");
}
document.addEventListener("keydown", superCallback);
// на этот момент мы объявили функцию и повесили слушатель события
// дальше всё, делать больше нечего, движок JS свободен
// но слушатель сидит, ждёт.
Наступает const repack = arr => {
const result = [...new Array(1 + Math.floor((arr.length - 1) / 2.5))].map(() => []);
arr.forEach((el, i) => result[Math.floor(i / 2.5)].push(el));
return result;
}
JSON.stringify(repack([1, 2, 3, 4, 5, 6, 7, 8, 9]))
// "[[1,2,3],[4,5],[6,7,8],[9]]"
[...new Array(length)].fill(value) // тут не годится, т.к. заполняем пустыми массивами
// и чтобы это не был один и тот же массив («передача по ссылке»)
// заполняем другим способом, через map()
[...new Array(length)].map(() => [])
3, 2, 3, 2, ...
через Math.floor(i / 2.5)
data:image/jpeg;base64,
<img src="data:image/jpeg;base64,/9j/4AAQ..." />
then()
— как приклеить стикер на циферблат, где написано, что надо будет сделать, когда время придёт. then()
ничего не попадает «сразу». Вернее, в него сразу передают 2 функции: одну вызовут, когда промис выполнится; вторую – если обломается: .then(onResolve, onError)
await
прячет под капот движка JS лишние провода, и наверху просто возвращает результат выполненной асинхроты. Или кидает Exception в случае облома — его надо ловить обычными try..catch
const requestPromise = new Promise(function(res, rej) {
setTimeout( function(result){ // имитация асинхр запроса куда-то
// тут, типа, наконец получили ответ
if (result.error_code) {
rej(error_code); // облом
} else {
res(result); // обещание выполнено с результатом
}
}, 2000);
});
// здесь requestPromise – это Promise в статусе "pending"
requestPromise.then( // сюда ничего не попадает «сразу». Оно внутри ждёт. Терпеливо.
function(result) {console.log(result, "мы молодцы");},
function(error) {console.error(error, "облом вышел");},
);
При желании можно навесить ещё requestPromise.then(r => console.log("result log:", r));
collision(enemy[i].x,enemy[i].y,player[j].x,player[j].y,32,32,32,32,player.splice(j,1),enemy.splice(i,1));
В функцию передаётся не действие, которое надо выполнить в случае — а его результат. Вот этиplayer.splice(j,1)
enemy.splice(i,1)
выполняются сразу, при первом же обращении — и не останется ни игроков ни врагов. Ядерная зима.collision()
, чтобы там её вызвали только после проверки условий.x, y, w, h
. Так можно передавать сами объекты целиком:function collision(A, B, onCollision) {
if (
A.x + A.w >= B.x
&& A.x <= B.x + B.w
&& A.y + A.h >= B.y
&& A.y <= B.y + B.h
) {
onCollision(); // <-- только тут выполнятся действия
}
}
// ...
player.push({x: 0, y: 0, w: 32, h: 32});
enemy.push({x: 144, y: 104, w: 32, h: 32});
// ...
collision(
enemy[i],
player[j],
function() {
player.splice(j,1);
enemy.splice(i,1);
}
);
// заменить это:
$('#api-cat #song'+id+', #api-wb #song'+id+'').index()
// на это:
($('#api-cat #song'+id+', #api-wb #song'+id+'').index() + 1)
$('h1 em').html([
'Играет',
$('#api-cat #song'+id+', #api-wb #song'+id+'').index() + 1,
'трек из',
$('h1').attr('data'),
'<i class="fa fa-cube"><i>',
].join(' '));