нужна помощь в создании аналога критической секции на javascript, то есть вход следующей функции в критическую секцию должен выполняться после выхода предыдущей, вот что есть сейчас:
class CriticalSection {
constructor() {
this._flag = false;
}
enter() {
if (!this._flag) {
return new Promise((resolve, reject) => {
this._flag = true;
setTimeout(() => resolve(), 3000);
});
} else {
//здесь нужно какое-то ограничение
}
}
leav() {
this._flag = false;
}
}
let cs = new CriticalSection();
cs.enter().then((value) => {
setTimeout(() => {
console.log(`1`);
cs.leav();
}, 2000)
}, null);
cs.enter().then((value) => {
setTimeout(() => {
console.log(`2`);
cs.leav();
}, 2000)
}, null);
Если проверка на закрытие верной секции не требуется, можно заменить токен на флаг.
class CriticalSection {
constructor() {
this.queue = []
this.token = null
}
enter() {
return new Promise((resolve, reject) => {
if (this.token) {
this.queue.push(() => resolve(this.token = {}))
} else {
resolve(this.token = {})
}
})
}
leave(token) {
if (this.token !== token) {
throw new Error("Leaving the wrong section")
}
if (this.queue.length) {
this.queue.shift()()
} else {
this.token = null
}
}
}
let cs = new CriticalSection();
cs.enter().then(token => {
console.log("Entered #1")
setTimeout(() => {
console.log("Timeout #1");
cs.leave(token);
console.log("Left #1");
}, 2000)
}, null);
cs.enter().then(token => {
console.log("Entered #2")
setTimeout(() => {
console.log("Timeout #2");
cs.leave(token);
console.log("Left #2");
}, 2000)
}, null);
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости