var isRefreshing = null;
var refreshingCall = null;
async function request() {
while (true) {
if (isRefreshing) {
const refreshed = await refreshingCall;
isRefreshing = false;
}
const response = await fetch(...);
const data = await response.json();
if (!data.needRefresh) {
return data;
}
isRefreshing = true;
refreshingCall = doRefresh(...);
}
}
async function doRefresh(...) {
...
}
Основная идея - использование глобального флага обновления токена и глобальной переменной с промисом. Первый запрос, обнаруживший необходимость обновления, выставляет флаг и записывает промис, который возвращает функция обновления. Второй (и последующие) запрос видит, что флаг уже стоит и просто ждёт выполнения промиса. exit:
for (let l = 1; l < 10; l += 1) {
for (let f = 1; f < 10; f += 1) {
if (f === l) {
continue;
}
for (let i = 0; i < 10; i += 1) {
if (i === l || i === f) {
continue;
}
for (let r = 0; r < 10; r += 1) {
if (r === l || r === f || r === i) {
continue;
}
for (let k = 0; k < 10; k += 1) {
if (k === l || k === f || k === i || k === r) {
continue;
}
for (let z = 0; z < 10; z += 1) {
if (z === l || z === f || z === i || z === r || z === k) {
continue;
}
for (let a = 0; a < 10; a += 2) {
if (a === l || a === f || a === i || a === r || a === k || a === z) {
continue;
}
const lirik = l * 10000 + i * 1010 + r * 100 + k;
const fizika = f * 100000 + i * 10100 + z * 1000 + k * 10 + a;
if (lirik * 2 === fizika) {
console.log(`lirik = ${lirik}`);
console.log(`fizika = ${fizika}`);
break exit;
}
}
}
}
}
}
}
}
Вариант на JS. WITH
`cte1` AS (
SELECT `to_user_id` AS `respondent`, `message`, `datetime`,
'outgoing' AS `direction`
FROM `messages`
WHERE `from_user_id` = :userId
UNION ALL
SELECT `from_user_id`, `message`, `datetime`,
'incoming' AS `direction`
FROM `messages`
WHERE `to_user_id` = :userId
),
`cte2` AS (
SELECT `respondent`, `message`, `datetime`, `direction`,
ROW_NUMBER() OVER `w` AS `row_num`
FROM `cte1`
WINDOW `w` AS (
PARTITION BY `respondent`
ORDER BY `datetime` DESC
)
)
SELECT `respondent`, `message`, `datetime`, `direction`
FROM `cte2`
WHERE `row_num` = 1