如何在GraphQL突变/解析器中为每个用户创建和停止唯一计时器

时间:2018-06-23 21:47:16

标签: graphql apollo graphql-js react-apollo graphql-subscriptions

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

我基本上设置了函数,以便可以传递两种类型的数字。正面或负面。这是一个示例:

为清楚起见,我不能将定时器分配给的“ 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 :(得分: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;
  }
};