2015-12-26 16 views
5

Sorunumu düzgün bir şekilde açıklamaya çalışacağım. Böyle, numara her 30 saniyede oluşturmak istiyorum:Her cihazda aynı anda her 30 saniyede bir işlevi nasıl çağırabilirim?

function getRandomNumber(min, max) { 
     return Math.floor(Math.random() * (max - min + 1)) + min; 
    } 
setTimeout(function(){ 
     getRandomNumber(0,14); 
    }, 30000); 

Bu benim bu kodla sayfasını açarsanız, ben rastgele sayı alacak gibi iyi, ama her cihazda aynı değildir çalışır, ancak arkadaşım eğer örneğin sonra açar Sayfayı açtığımdan 5 saniye gecikme yaşanıyor. Düzeltmek için herhangi bir yolu var mı? Zaman sunucusu almak gibi bir şey düşündüm ve ona göre işe yarayabilirdi, ama nasıl yapılacağını bilmiyorum.

+0

websockets, uzun zamandır ya da herhangi bir çok yönlü sunucu-istemci haberleşme teknisyeni genellikle bu gibi durumlarda faturaya uymaktadır - bir sunucu kurulumunuz olduğunu aklınızda tutarak, –

+0

Bu, çözülmesi çok zor bir sorundur. Zamanın doğru bir şekilde ayarlandığını ve senkronize edildiğini varsayarak, tüm istemciler büyük bir varsayımdır ve büyük olasılıkla kötü bir şekilde sona erdirilir. Prosedürü tersine çevirmeyi ve sunucudan tüm istemcilere bir bildirim çıkarmayı öneririm, böylece mümkün olan tek fark ağ gecikme süresine iner. Bunu yapmak için websockets kullanmaya bakın. –

+0

İlk zaman aşımını, sistem saatine göre sonraki 30 saniyede gerçekleşecek şekilde ayarlayabilirsiniz. Senkronizasyon mümkün olduğunca kesin olmak zorundaysa, sunucudan zaman almalısınız. Sunucu, örneğin json olarak yazdırarak ve html'de bir hs değişkenine veya bir html veri özniteliğine yerleştirerek milisaniyeyi sonraki 30 saniyeye bile aktarabilir. Websockets yoluyla senkronize etmek muhtemelen en doğru sonuç olacaktır, ancak ilk zaman damgasıyla kolayca oldukça doğru bir sonuç elde edebilirsiniz. – Tuure

cevap

1

Bu soruna mükemmel bir çözüm yok, burada iki seçenek var:
Basit ve karmaşık bir tane daha kesin olmalıdır.


Eğer ilk çağrı için new Date().getTime() % 30000 kullanabilirsiniz * tüm cihazlarda aynı zaman var, bu yüzden senkronizasyonunu hepsi ve daha sonra her zaman aşımı içinde 30000 sabit kullanın.

function getRandomNumber(min, max) { 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
} 
setTimeout(function() { 
    getRandomNumber(0, 14); 
}, new Date().getTime() % 30000); // first time use this 

* önemli olmayacak Timezones fakat


başka yolu da bir dakika saniye sunucu zamanını geçmesine izin için olur ve sonra yükleme süresini düzeltmek için gecikme tahmin ve 30 katları sırasında o yuvarlak, sonra getSeconds ile saniye okuma, yeni bir Date nesne oluşturmak olacaktır en basit çözümün new Date().getTime()

+0

Teşekkürler, deneyeceğim! – Hugo

+3

sadece tüm cihazların aynı zamana sahip olması durumunda çalışır. –

+2

Bu bir ** masif ** varsayım olsa da, ve daha sonra JS zamanlayıcıların doğruluğu çok güvenilir değildir. –

0

Bir'in o instad kullanıpile sonraki adıma jeneratör zamanlama. Başladıktan sonra, aynı işlevle tekrar planlamak veya setInterval ile bir aralık belirlemek için karar verebilirsiniz.

Yerel saate güvenmek istemiyorsanız, sanırım ntp gibi bir hizmeti kullanmanız gerekir, ancak bu zamana uygulanacak deliğin ne olduğunu bilmenizi gerektirir.

0

Bunu bir satır PHP ile yapabilirsiniz.

Burada çalışır. o tekrar edecektir yüzden, yerine setTimeout ait setInterval kullanılan

<script> 
    function getRandomNumber(min, max) { 
     return Math.floor(Math.random() * (max - min + 1)) + min; 
    } 

    // The variable 'startTime' is synchronized with the server 
    var startTime=parseInt(<?php echo date("now")?>); 

    setInterval(function() { 
     startTime++; 
     if(startTime%30==0) document.write(parseInt(getRandomNumber(0, 14)).toString()+"<br>"); 
    }, 1000); 
</script> 

Not.

İlgili konular