Я запутался в том, что хочу сделать.
но знаю что setTimeout работает криво,
накапливается или вовсе перестает работать
Как мне перезапускать скрипт после развертывания браузера телефона
let socket;
const url = "ws://your-websocket-server-url";
function connect() {
socket = new WebSocket(url);
socket.onopen = () => {};
socket.onmessage = (event) => {};
socket.onerror = (error) => {};
socket.onclose = (event) => {};
}
function reconnect() {
if (socket && socket.readyState !== WebSocket.CLOSED) return;
.....
}
function send(message) {
if (socket && socket.readyState === WebSocket.OPEN) {
socket.send(message);
return
}
console.warn("WebSocket is not open. Message not sent:", message);
....
}
document.addEventListener('visibilitychange', () => {
// document.hidden
if (document.visibilityState === 'visible' && websocket.readyState === WebSocket.CLOSED) {
reconnect();
}
});
API to allow messages to be pushed from a server to a browser, even when the site isn't focused or even open in the browser.
{ 'старый ключ': 'новый ключ' }
:const keys = {
x: 'a',
y: 'b',
z: 'c',
};
const renameKeys = (obj, keys) =>
Object.fromEntries(Object
.entries(obj)
.map(([ k, v ]) => [ Object.hasOwn(keys, k) ? keys[k] : k, v ])
);
// или
const renameKeys = (obj, keys) =>
Object.keys(obj).reduce((acc, k) => (
acc[keys[k] ?? k] = obj[k],
acc
), {});
const newArr = arr.map(n => renameKeys(n, keys));
function renameKeys(keys, obj) {
for (const k in keys) {
if (obj.hasOwnProperty(k)) {
obj[keys[k]] = obj[k];
delete obj[k];
}
}
}
arr.forEach(renameKeys.bind(null, keys));
вместо условных 100 кликов людям засчитывало ~40судя по sql у тебя количество сохраняемых кликов считается как сначала запросом получить текущее значение, затем сохранить его увеличенным... что естественно неправильно обсчитывается, если одновременно на бакэнд идут несколько запросов, и завершаются в разном порядке (т.е. первый, получил значение 1, затем его обогнал второй, получил то же значение 1, оба отправляют +1 значение, т.е. 2, вместо ожидаемого 3.
update set clicks=clicks+1, last_click_time=now() where last_click_time+:ALLOWED_CLICK_INTERVAL<now() and id=:current_id
$items = array_intersect(
$companyItems, // на сайте
array_map(
function (string $item) {
$parts = explode(' ', $item);
return end($parts);
},
$supplierItems // от поставщика
),
);
Проверкаin_array($item['name'], $supplierNames, true)
if (document.readyState === 'complete') {
someFunction();
} else {
window.addEventListener('load', someFunction);
}
А в чем проблема проверить тогда без этого теста?
покупки
, к которой полиморфично (properties_type
, properties_id
) привязаны таблицы со значениями свойств каждого типа сущности выглядит немного лучше.