Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在GraphQL/Resolver中为每个用户创建和停止唯一计时器_Graphql_Apollo_Graphql Js_React Apollo_Graphql Subscriptions - Fatal编程技术网

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

如何在GraphQL/Resolver中为每个用户创建和停止唯一计时器,graphql,apollo,graphql-js,react-apollo,graphql-subscriptions,Graphql,Apollo,Graphql Js,React Apollo,Graphql Subscriptions,我正在制作一个应用程序,它要求我给每个用户一个6秒的间隔计时器,每6秒完成一次操作。我已经有它的工作,计时器可以是唯一的功能,但主要的问题是,我不能动态取消他们,如果我调用一个不同的参数的功能。我只能通过创建一个方法来取消计时器,在该方法中,在某个倒计时时,它将清除间隔(action) 我基本上设置了这个函数,这样我就可以传递两种类型的数字。否定或肯定。以下是一个例子: 明确地说,我不能将计时器分配给的“actions”变量分配到函数之外,因为它只允许服务器运行一个计时器,而不是每个用户所需的一

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

我基本上设置了这个函数,这样我就可以传递两种类型的数字。否定或肯定。以下是一个例子:

明确地说,我不能将计时器分配给的“actions”变量分配到函数之外,因为它只允许服务器运行一个计时器,而不是每个用户所需的一个计时器。我真的搞不懂

graphql解析器

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

我明白了。我只是在所有东西之外创建了一个名为timers的对象,并将timers推入该对象中,以便稍后进行引用以进行销毁。很抱歉这么含糊,我实际上在自己的代码之外还写了这段代码,以展示我所做的事情的想法,而不透露我正在做什么/背后的任何更商业化的逻辑

我希望这能帮助一些人,但不知何故,我认为这种情况是一种利基

如果有人有更好的答案可以提高性能,我很乐意听到。这是我目前的工作

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

没人能给我一个暗示?我完全不明白这件事。。大多数事情我都可以通过阅读或研究来解决,但这似乎。。令人困惑。