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.