Mettre à jour la balise de toile html sur chaque requête ajax avec de nouvelles données

Je souhaite mettre à jour ma toile sur chaque requête ajax si un nouvel utilisateur est trouvé ou s'il y a une nouvelle connexion d'utilisateurs existants.

J'ai des utilisateurs et des connexions entre eux:

var data=[ { "Id": 38, "Connections":[39,40], "Name":"ABc" }, { "Id": 39, "Connections":[40], "Name":"pqr" }, { "Id": 40, "Connections":[], "Name":"lmn" }] 

Dans l'exemple précédent, l'utilisateur avec Id:38 est connecté aux user 39 and 40 et l' user 39 is connected to user 40 and user 40 est déjà connecté à l' user 39 and user 38 so user 40 Connection array is blank .

J'ai 1 web service dont je déclencherai every 1-2 seconds pour afficher les nouveaux utilisateurs nouvellement connectés sur cette page et une nouvelle connexion entre les utilisateurs existants que j'ai stockés dans ma table et ce service Web récupéreront tous les utilisateurs avec leurs connexions.

Donc, d'abord, ma page sera chargée, mais après, ma page ne sera pas actualisée et de nouveaux utilisateurs devraient être affichés et de nouvelles connexions devraient être connectées avec un ajax call to my web service .

Mais avec la demande d'ajax, tout est dérangé. C'est 1 js bin que j'ai créé: Demo

Produit que je reçois: Entrez la description de l'image ici

J'ai seulement 4 utilisateurs et 3 connexions comme vous pouvez le voir dans ma js bin output alors il ne devrait y avoir que 4 rectangles et je n'ajoute plus d'utilisateurs mais obtenez toujours cette sortie désordonnée.

Référence du code source: Violon de référence

J'essaie d'obtenir la sortie comme indiqué dans le violon ci-dessus mais pas de l'obtenir.

Production attendue : 4 rectangles avec animation

Quelqu'un peut-il m'aider avec ça car je suis totalement nouveau sur toile.

Mise à jour Js bin Demo : Mise à jour Js Bin

Avec le js bin mis à jour ci-dessus, je reçois cette sortie, mais ils ne bougent pas (l'animation ne fonctionne pas): Sortie mise à jour

Les boîtes ne bougent pas parce que le code pour les déplacer n'est jamais appelé.

Si vous déplacez la partie animant les boîtes de updateUsers() sur votre boucle d'animation principale, elles seront animées.

Déplacez la section de cette partie:

 function updateUsers() { fetchData(); // this part ------------------------------------------------------ $.each(users, function(index, user) { if (user.x <= 0) user.dir.x = 1; if (user.x + user.width > canvas.width) user.dir.x = -1; if (user.y <= 0) user.dir.y = 1; if (user.y + user.height > canvas.height) user.dir.y = -1; user.x += user.dir.x; user.y += user.dir.y; }); // to here -------------------------------------------------------- //window.setTimeout(updateUsers, 1000 / 60); window.setTimeout(updateUsers, 9000); } 

jusqu'ici:

 function drawUsers() { ctx.clearRect(0, 0, canvas.width, canvas.height); $.each(users, function(index, user) { ctx.beginPath(); ctx.rect(user.x, user.y, user.width, user.height); ctx.strokeStyle = 'red'; ctx.stroke(); if (user.connections != null) { user.connections.forEach(function(id) { const other = users.find(user => user.id === id); ctx.beginPath(); ctx.moveTo(user.x + (user.width / 2), user.y + (user.height / 2)); ctx.lineTo(other.x + (other.width / 2), other.y + (other.height / 2)); ctx.strokeStyle = 'black'; ctx.stroke(); }); } }); // animate here $.each(users, function(index, user) { if (user.x <= 0) user.dir.x = 1; if (user.x + user.width > canvas.width) user.dir.x = -1; if (user.y <= 0) user.dir.y = 1; if (user.y + user.height > canvas.height) user.dir.y = -1; user.x += user.dir.x; user.y += user.dir.y; }); window.requestAnimationFrame(drawUsers); } 

Puisque nous n'avons pas accès au service Web que vous utilisez, et en supposant que les données sont correctement retournées, j'ai dû décommenter les données prédéfinies pour faire une démonstration de travail:

Mise à jour de jsbin

J'ai travaillé à partir de votre code source Code Violon, ce qui m'a beaucoup aidé.

Ajouté quelques choses:

Première fonction séparée pour ajouter un utilisateur au tableau des users . De cette façon, les utilisateurs peuvent facilement être ajoutés après un appel Webservé.

Deuxièmement, ajouté quelques fonctions helper pour obtenir des positions et des directions aléatoires.

 function addUser(user) { users.push({ id: user.UserId, connections: user.Connections, width: 80, height: 80, x: getRandomX(), y: getRandomY(), dir: { x: getDir(), y: getDir() } }); } // the success callback from your webservice // guess this receives a `user` object with Id and Connections // for the test we use `getRandomConnections` function getDataFromWebService() { let newUser = { "UserId": Date.now(), "Connections": getRandomConnections() }; addUser(newUser); } 

Violon

Lorsque vous connectez votre service Web, vous pouvez abandonner la fonction et la référence getRandomConnections . Dans votre rappel de succès de service web, assurez-vous d'avoir un objet dans le format:

 { UserId: 1337, Connections: [1, 2] } 

Passez cet objet à la fonction addUser .