Mon application est un jeu dans lequel un utilisateur a 30 minutes pour finir .... Node Backend
Chaque fois qu'un utilisateur commence une partie, une fonction seinterval est déclenchée du serveur ... une fois que 30 minutes est compté alors I ClearInterval. P>
Comment puis-je vous assurer que chaque seinterval est unique à l'utilisateur particulier et à la variable seinterval n'est pas écrasée chaque fois qu'un nouvel utilisateur commence une partie? (Ou tous les seintervals sont effacés chaque fois que je suis clair). On dirait que je devrais avoir besoin de créer une variable unique "intervalle" pour chaque nouvel utilisateur qui commence jeu ?? p>
ci-dessous le code est déclenché chaque fois qu'un nouvel utilisateur commence un jeu p> merci !! p> p> p>
3 Réponses :
Premier: intervalles et minuteries simultanées ne sont pas la meilleure approche de conception de JS, il est préférable d'utiliser une minuterie globale et une liste d'objets stockant le début, la fin, l'userid, etc. et les mettre à jour dans une boucle.
Quoi qu'il en soit. . Pour que votre identifiant d'intervalle soit lié à une certaine portée, vous pouvez utiliser une promesse, comme: p> de cette manière chaque fois que chaque minuterie va courir "sur elle-même". J'ai utilisé Settimeout code> ici depuis que cela requête
boucle code> avant de faire tout ce qu'il devait. Il devrait fonctionner avec
seinterval code> aussi et ressemble à celui: P>
const runTimer = (duration, userid, ontick) => new Promise(res => {
const
start = new Date().getTime(),
iid = setInterval(
() => {
const delta = new Date().getTime() - start;
if (delta < duration) {
//if you want to trigger something each time
ontick(delta, userid);
} else {
clearInterval(iid);
res(userid);
}
}, 500)
;
});
Nous avons utilisé Agenda pour un joli bilan de stratégie qui offre le bénéfice de la persistance si le nœud Application de l'application, etc.
Nous avons incorporé l'ID utilisateur dans le nom du travail et planifierait ensuite le travail, ainsi que des données à traiter, pour exécuter à une heure déterminée spécifiant un gestionnaire à exécuter. P>
Le gestionnaire exécuterait alors le travail et effectuerait les tâches pertinentes. P>
// create a unique jobname const jobName = `${player.id}|${constants.events.game.createBuilding}`; // define a job to run with handler services.scheduler.define(jobName, checkCreateBuildingComplete); // schedule it to run and pass the data services.scheduler.schedule(at.toISOString(), jobName, { id: id, instance: instance, started: when });
Merci @chev et @Philipp, ce sont de bonnes réponses.
J'ai été informé d'une technique où vous utilisez une matrice pour la variable seinterval ..... Cela rendrait mon code comme suit; P>
let intervals = [] let secondsLeft = 300000; intervals['i'+userId] = setInterval(() => { secondsLeft -= 1000; if (secondsLeft === 0) { console.log("now exit"); clearInterval(interval); } }, 10000);
Vous pouvez simplement conserver un objet si l'identifiant est approprié ou de référence de référence aux intervalles tels que [Userid] = seinterval (..), etc. Ce n'est pas une solution robuste en tant que serveurs redémarrer / crash, puis tous vos joueurs ont des problèmes. !
Si c'était moi, j'enregistrerais l'heure de début du jeu et calculeriez l'heure de fin du jeu et enregistrez ces données correspondant à l'ID utilisateur plutôt que à l'aide de
seinterval code> sur serveur.