Коллбек settimeout перестает вызываться

У меня есть проект на nodeJS v11.1.0, и имеется асинхронный вызов таймера

const sleep = (ms) => new Promise(r => setTimeout(r, ms));

Вот пример функции как я её использую:

const taskEat = async (player, item) => {
    if (player.foodTimeout > Date.now()) return

    player.foodTimeout = Date.now() + 1000 * 5;

    await inventory.useItem(player, item);
    await sleep(5000);
    player.call('foodFinished');
}

По какой-то неизвестной причине callback с resolve не вызывается по всему проекту. Это происходит в рандомное время, иногда через пару минут после старта проекта, а иногда через пару дней происходят зависания. И это не всегда, практически это невозможно повторить в одиночку через дебаггер. Раньше когда мы заметили о такой проблеме, не сильно придавали значение, ведь зависало где-то на пару минут и потом отвичало. Сейчас же оно зависает на 30 минут, а порой вообще не отвисает после одного часа с момента зависания. Пробовали также использовать библиотеку bluebird с функцией .delay(), однако это не изменило ситуацию, таймеры продолжают зависать. При этом сам проект спокойно работает, промисы, функции и прочее работает без проблем. Даже setInterval работает без проблем.

Кто-нибудь сталкивался с такой проблемой? И почему вообще setTimeout может зависнуть


Ответы (1 шт):

Автор решения: Август

тогда попробуйте использовать метод queueMicrotask, а именно переписать таймер так:

const sleep = ms => new Promise(r => queueMicrotask( () => setTimeout(r, ms) ));
→ Ссылка