0

我正在制作一个应用程序,它要求我给每个用户一个 6 秒的间隔计时器,该计时器将每 6 秒完成一次操作。我已经让定时器可以基于函数是唯一的,但主要问题是如果我用不同的参数调用函数,我无法动态取消它们。我只能通过创建一个方法来取消计时器,该方法在某个倒计时将 clearInterval(action);

我基本上设置了函数,以便我可以传递两种类型的数字。消极或积极。这是一个例子:

需要明确的是,我不能将定时器分配给的“动作”变量分配给函数之外,因为它只允许服务器运行一个定时器而不是每个用户所需的一个定时器。我真的无法弄清楚这一点!

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

1 回答 1

0

弄清楚了。我刚刚在称为计时器的所有内容之外创建了一个对象,并将计时器推送到该对象中,以便稍后引用以进行销毁。抱歉这么含糊,我实际上是在我自己的代码之外编写了这段代码,以显示我所做的事情的一个想法,而没有透露我在做什么/它背后的任何更像业务的逻辑。

我希望这对某人有所帮助,但我不知何故认为这种情况有点小众。

如果有人有更好的答案可以提高性能,我很想听听。这是我现在的技巧。

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;
  }
};
于 2018-06-24T03:17:16.310 回答