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

Posted

技术标签:

【中文标题】如何在 GraphQL 突变/解析器中为每个用户创建和停止唯一的计时器【英文标题】:How to create AND stop unique timer for each user in GraphQL mutations/resolvers 【发布时间】:2018-12-02 22:58:14 【问题描述】:

我正在制作一个应用程序,它要求我为每个用户提供一个 6 秒的间隔计时器,该计时器将每 6 秒完成一次操作。我已经让定时器可以根据函数是唯一的,但主要问题是如果我用不同的参数调用函数,我无法动态取消它们。我只能通过创建一个方法来取消计时器,该方法在某个倒计时将 clearInterval(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】:

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

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

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

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

【讨论】:

以上是关于如何在 GraphQL 突变/解析器中为每个用户创建和停止唯一的计时器的主要内容,如果未能解决你的问题,请参考以下文章

express-graphql 解析器参数在解析器中为空,但 info variableValues 填充了名称和值

如何在 GraphiQL 中为 GraphQL 查询和突变添加名称?

如何在 React js 中为 GraphQL 中的互连表编写突变查询?

解析器中的 AppSync GraphQL 变异服务器逻辑

如何解决“变异返回数据为空”?

如何在连接到 mLab 的 GraphQL 中为“更新”数据编写 Mutation