如何在 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 查询和突变添加名称?