我正在制作一个应用程序,要求我给每个用户一个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;
}
},
答案 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;
}
};