Я делаю приложение, которое требует, чтобы я дал каждому пользователю 6-секундный интервальный таймер, который будет выполнять действия каждые 6 секунд. У меня уже работает, что таймеры могут быть уникальными в зависимости от функции, но основная проблема в том, что я не могу их динамически отменять, если я вспоминаю функцию с другим параметром. Я могу только отменить таймеры, создав метод, в котором при определенном обратном отсчете он очистит интервал (действие);
Я в основном настроил функцию так, чтобы я мог передавать два типа чисел. Отрицательный или положительный. Вот пример:
Чтобы было ясно, я не могу взять переменную «действия», которой назначен таймер, и назначить ее вне функции, поскольку это позволит серверу запускать только однократный таймер вместо однократного, необходимого для каждого пользователя. Я действительно просто не могу этого понять!
graphql resolver
Actions: async (_, number, {user}) => {
try {
await requireAuth(user);
if (number > 0) {
let doActions = setInterval(doStuff, 6000);
} else {
clearInterval(doActions);
}
function doStuff() {
if (userRelatedNumber > 0) {
"...actions in here"
} else {
clearInterval(doActions); //// does not work with recalling function with -1
}
}
} catch (e) {
throw e;
}
},


Догадаться. Я просто создал объект вне всего, что называется таймерами, и вставил таймеры в объект, на который позже будут ссылаться для уничтожения. Извините за такую расплывчатость, но на самом деле я написал этот код в дополнение к своему собственному, чтобы показать представление о том, что я сделал, не раскрывая, что я делаю / какой-либо из более деловой логики, стоящей за этим.
Я надеюсь, что это кому-то поможет, но мне почему-то кажется, что это обстоятельство было своего рода нишевым.
Если у кого-нибудь есть лучший ответ, который повысит производительность, я бы хотел его услышать. На данный момент это мой хак.
let timers = {};
Actions: async (_, number, { user }) => {
try {
await requireAuth(user);
let key = user._id;
/// if >= 0, we start timer, if it's less than 0 we end the timer.
if (number >= 0) {
if (timer[key]) {
return {
/* graphql resolver return here ( since the timer already exists, we don't start it again! )*/
};
} else {
startTimer(key);
}
} else {
clearTimer(key);
}
function clearTimer(key) {
clearInterval(timers[key].timers);
delete timers[key];
return {
/* graphql resolver return here */
};
}
function startTimer(key) {
let user_timer = setInterval(doStuff, 6000);
timers[key] = { ...timers[key], user_timer };
return {
/* ... graphql resolver return here */
};
}
function doStuff() {
if (/*numberOfTimersDecreenting */) {
/* DO STUFF */
} else { // if the user is out of timed actions
clearTimer(key);
}
}
} catch (e) {
throw e;
}
};
Никто не мог мне даже намекнуть? Я полностью потерялся в этом ... большинство вещей, которые я могу понять, читая или исследуя, но это кажется ... озадачивающим.