Правильный расчёт времени для выполнения действия

xyligan

Паркетный пол трещит под моей крышкой черепной
Сообщения
900
Реакции
433
Доброго времени суток, дорогие участники форума!

Пишу модуль для npm. Возникла некая проблема с подсчётом времени. Может кто подскажет, как правильнее его посчитать, т.к. действие, которое должно выполняться через время указанное пользователем, выполняется через 5 секунд.

async _init() - функция запуска бота + интервала.
get remainingTime() - функция подсчёта времени через которое будет выполняться действие (заданное пользователем время[endAt] - нынешнее время[Date.now()]).
_checkCase() - функция, выполняющая действие при заданном условии(которое должно быть таким: если время заданное пользователем прошло, то будет выполняться действие, но в итоге проходит 5 секунд и действие выполняется)

JavaScript:
async _init() {
    this.cases = await this._initStorage();
    setInterval(() => {
        if (this.client.readyAt) {
            this._checkCase.call(this);
        }
    }, 5000);
    this.ready = true;
}

JavaScript:
get remainingTime() {
    return this.endAt - Date.now();
}

JavaScript:
_checkCase() {
    if (this.cases.length <= 0) return;
    this.cases.forEach(async caseData => {
        let caseObj = new Case(this, caseData);
        if (caseObj.ended) return;
        if (!caseObj.type) return;
        if (caseObj.remainingTime <= 0) {
            this.end(caseObj.id);
        }
        await caseObj.fetchGuild();
        if (!caseObj.guild) {
            caseObj.ended = true;
            await this._markAsEnded(caseObj.id);
            return;
        }
    });
}
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
Мне кажется, что проблема в setInterval, второй аргумент у которого как раз и равен 5000 миллисекундам. Вместо этого наверное должен быть вызов remainingTime.
Также хочу заметить, что setInterval будет постоянно вызывать функцию с заданным интервалом. Если нужно выполнить код только один раз, лучше использовать setTimeout.
 
Сверху Снизу