SORU
29 HAZİRAN 2010, Salı


Javascript: setTimeout basın()?

Benim değil ve olamaz kütüphane kod (makul) değişikliği ile etkileşim bazı Javascript yazıyorum. Javascript zaman aşımı, zaman sınırlı bir dizi soru sonraki soru göstermek için kullanılan oluşturur. Bu ümitsiz karıştırılmış, çünkü gerçek bir kod değil. Kütüphane yapıyor:

....
// setup a timeout to go to the next question based on user-supplied time
var t = questionTime * 1000
test.currentTimeout = setTimeout( showNextQuestion(questions[i 1]), t );

Zamanlayıcı setTimeout tarafından oluşturulan sorguluyor tarafından questionTime * 1000 doğru doldurur bir ilerleme çubuğu ekranda koymak istiyorum. Tek sorun, bunu yapmak için bir yol var gibi görünüyor yok. Atladığım getTimeout bir işlevi var mı? Bulabildiğim Javascript zaman aşımı sadece bilgi sadece setTimeout( function, time) clearTimeout( id ) üzerinden silme yoluyla yaratılması ile ilgilidir.

Zaman bir zaman aşımı önce kalan yangınlar döndüren bir işlev için arıyorum, bir süre sonra geçen çağrıldı. İlerleme çubuğu benim kod bu gibi görünüyor:

var  timeleft = getTimeout( test.currentTimeout ); // I don't know how to do this
var  $bar = $('.control .bar');
while ( timeleft > 1 ) {
    $bar.width(timeleft / test.defaultQuestionTime * 1000);
}

tl;dr:Ne zaman bir javascript setTimeout önce kalan bulabilirim()?


İşte şimdi kullanıyorum çözüm. Testleri ile sorumlu kütüphane bölümüne gittim ve kodu (korkunç, ve benim izinler karşı) çözdüm.

// setup a timeout to go to the next question based on user-supplied time
var t = questionTime * 1000
test.currentTimeout = mySetTimeout( showNextQuestion(questions[i 1]), t );

ve burada benim kod:

// wrapper for setTimeout
function mySetTimeout( func, timeout ) {
    timeouts[ n = setTimeout( func, timeout ) ] = {
        start: new Date().getTime(),
        end: new Date().getTime()   timeout
        t: timeout
    }
    return n;
}

Bu IE 6 değil tüm tarayıcılarda nokta üzerinde çok çalışıyor. Zaman uyumsuz şeyler almak için bekliyordum orijinal iPhone bile.

CEVAP
28 Mayıs 2012, PAZARTESİ


Sadece kayıt için, zaman node.js sol almak için bir yol var:

var timeout = setTimeout(function() {}, 3600 * 1000);

setInterval(function() {
    console.log('Time left: ' getTimeLeft(timeout) 's');
}, 2000);

function getTimeLeft(timeout) {
    return Math.ceil((timeout._idleStart   timeout._idleTimeout - Date.now()) / 1000);
}

Baskı:

$ node test.js 
Time left: 3599s
Time left: 3597s
Time left: 3595s
Time left: 3593s

Bu firefox çalışmıyor gibi görünüyor, ama node.js javascript olduğu için, bu sözler insanların düğüm çözüm arayanlar için faydalı olabileceğini düşündüm.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • NCIX Tech Tips

    NCIX Tech Ti

    2 Ocak 2007
  • Samantha Crain

    Samantha Cra

    30 EKİM 2008
  • Tome Rodrigo

    Tome Rodrigo

    9 Temmuz 2006