2010-06-07 4 views
1

Je développe une application web en utilisant asp.net mvc, et j'ai besoin de faire un chronomètre (avec 30 secondes préprogrammées pour démarrer à un certain moment) sur client- D'ailleurs, en utilisant l'heure du serveur, l'horloge du client ne peut pas être l'horloge du serveur. Donc, j'utilise Jquery pour appeler le serveur par JSON et obtenir le temps, mais il est très contrainte parce que chacun seconde, j'appelle le serveur pour obtenir du temps, quelque chose comme ceci:Il est temps de démarrer un compteur côté client

$(function() { 
     GetTimeByServer(); 
    }); 

    function GetTimeByServer() { 
     $.getJSon('/Home/Time', null, function(result) { 
     if (result.SecondsPending < 30) { 
      // call another function to start an chronometer 
     } else { 
      window.SetTimeout(GetTimeByServer, 1000); //call again each 1 second! 
     } 
     }); 
    } 

Il fonctionne très bien, mais quand j'ai plus de 3 ou 4 appels comme ça, le navigateur fonctionne lentement mais fonctionne! Je voudrais savoir, comment améliorer plus performace côté client, ou s'il y a un moyen de le faire ... est-il possible pour le client d'écouter le serveur comme un "socket" pour savoir si le chronomètre doit démarrer ...

PS: Désolé pour mon anglais!

grâce Vive

+0

Le temps passe-t-il progressivement différemment sur le client? JavaScript a un objet 'Date', pourquoi ne pouvez-vous pas le définir sur le chargement de la page et l'heure du client? –

+0

Note: cette approche fera frire votre serveur dès que vous aurez plus de 20 utilisateurs simultanés (peut-être plus tôt) - il ne s'agrandit pas bien; De plus, la latence de transfert (variation) supprimera toute illusion de précision temporelle. – Piskvor

+0

Piskvor, et vous suggérez quelque chose que puis-je faire pour améliorer la performance? –

Répondre

2

Felipe, Lors du chargement de la page, vous obtenez l'heure du serveur et l'heure du client. et utilisez les deux en référence pour déterminer l'heure du serveur côté serveur sans utiliser d'appel AJAX à chaque fois. Désolé pour l'excès de code suedo mais il ne devrait pas être trop dur.

var ServerTimeReference; 
var ClientTimeReference; 
function InitializeTime() 
    $.getJSon('/Home/Time', null, function (result) { 
     ServerTimeReference = result.ServerTime; //convert to js time 
     ClientTimeReference = new Date(); 
    }); 

function GetServerTime() { 
    var TimeDifference = //get the difference between server and Client time 
    var CurrentClientDateTime = new Date(); 
    var CurrentServerTime = // using timedifference and CurrentClientDateTime calculate ServerTime 
    return CurrentServerTime; 
} 
+0

Salut John, merci pour aswser. J'ai oublié de dire ... le chronomètre devrait être égal pour tous les utilisateurs de la session sur le site. C'est une raison pour laquelle j'ai besoin d'utiliser le temps du serveur! Si j'utilise le temps du client, les utilisateurs peuvent influencer le script en modifiant l'horloge des fenêtres. De cette façon que vous dites, est un moyen de sécurité pour améliorer un stopwacther?Ou vous avez suggéré quelque chose de plus? –

+0

vous pouvez utiliser quelque chose comme ci-dessus et garder une trace de l'heure du serveur en utilisant setInterval. De cette façon, vous n'avez toujours qu'un seul appel sur le serveur lors du chargement de la page au lieu de plusieurs. Notez que si vous avez peur que l'horloge du serveur ne soit pas synchronisée, vous pouvez choisir de faire un appel ajax de 5 minutes. Cela vous empêchera de faire une requête ajax trop souvent. –

2

je ferais tout le temps de vérifier sur le côté client. Vous utilisez déjà jQuery, utilisez simplement un plugin timer. J'ai eu beaucoup de succès avec this one.

1

Si vous voulez vraiment l'utiliser comme ceci, vous essentiellement obtenu cette option:

Je ne comprends pas très bien pourquoi vous envoyez juste valeur le client et pas seulement une chaîne "GO" si le client doit commencer à faire quoi que ce soit. De toute façon, vous n'avez pas à interroger chaque seconde (je veux dire, si l'horloge de votre PC local est que ce serait un mauvais signe). Il devrait donc suffire de «synchroniser» toutes les 10 secondes par exemple (ce qui est également très rapide). Donc, ma stratégie de base serait, appelez une fonction backend qui indique à mon client, combien de temps il reste à faire et configurer un setTimeout sur cette valeur.

+0

Salut jAndy, merci pour aswser. J'ai oublié de dire ... le chronomètre devrait être égal pour tous les utilisateurs de la session sur le site. C'est une raison pour laquelle j'ai besoin d'utiliser le temps du serveur! Si j'utilise le temps du client, les utilisateurs peuvent influencer le script en modifiant l'horloge des fenêtres. En utilisant l'interrogation Ajax que vous dites, est un moyen de sécurité pour améliorer un stopwacther? Si j'avais beaucoup d'éléments sur ma page, est-ce un bon choix? Ou vous avez suggéré quelque chose de plus? Merci –

Questions connexes