Как создать И остановить уникальный таймер для каждого пользователя в мутациях / резольверах GraphQL - PullRequest
0 голосов
/ 24 июня 2018

Я создаю приложение, которое требует, чтобы я давал каждому пользователю 6-секундный интервальный таймер, который будет выполнять действия каждые 6 секунд.У меня уже работает, что таймеры могут быть уникальными в зависимости от функции, но главная проблема заключается в том, что я не могу динамически отменить их, если я вызываю функцию с другим параметром.Я могу только отменить таймеры, создав метод, в котором при определенном обратном отсчете он будет очищать Interval (действие);

Я в основном настроил функцию так, чтобы я мог передавать два типа чисел.Отрицательный или положительный.Вот пример:

Чтобы было ясно, я не могу взять переменную "actions", для которой назначен таймер, и назначить ее вне функции, так как она позволит серверу запускать только один таймер вместоодин таймер требуется для каждого пользователя.Я действительно просто не могу понять это!

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

1 Ответ

0 голосов
/ 24 июня 2018

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

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

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

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