0
votes

Plusieurs minuteries SetInterval sur le serveur de nœuds

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.

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

ci-dessous le code est déclenché chaque fois qu'un nouvel utilisateur commence un jeu xxx

merci !!


1 commentaires

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 sur serveur.


3 Réponses :


1
votes

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> xxx pré>

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

});


0 commentaires

2
votes

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


0 commentaires

0
votes

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


1 commentaires

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. !