Как создать и остановить уникальный таймер для каждого пользователя в мутации / преобразователях GraphQL

Я делаю приложение, которое требует, чтобы я дал каждому пользователю 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;
    }
},

Никто не мог мне даже намекнуть? Я полностью потерялся в этом ... большинство вещей, которые я могу понять, читая или исследуя, но это кажется ... озадачивающим.

asdfghjklm 24.06.2018 03:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
1
194
1

Ответы 1

Догадаться. Я просто создал объект вне всего, что называется таймерами, и вставил таймеры в объект, на который позже будут ссылаться для уничтожения. Извините за такую ​​расплывчатость, но на самом деле я написал этот код в дополнение к своему собственному, чтобы показать представление о том, что я сделал, не раскрывая, что я делаю / какой-либо из более деловой логики, стоящей за этим.

Я надеюсь, что это кому-то поможет, но мне почему-то кажется, что это обстоятельство было своего рода нишевым.

Если у кого-нибудь есть лучший ответ, который повысит производительность, я бы хотел его услышать. На данный момент это мой хак.

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;
  }
};

Другие вопросы по теме