SORU
7 Mart 2011, PAZARTESİ


-döngü içinde setTimeout ardışık değerleri yazdırmıyor

Bu komut dosyası var:

for (var i = 1; i <= 2; i  ) {
    setTimeout(function() { alert(i) }, 100);
}

Ama 3 iki kez 1 2 yerine uyarılır.

Bir yolu, bir dize olarak işlevini yazmadan i, geçmek var mı?

CEVAP
7 Mart 2011, PAZARTESİ


""Bulunması için zaman aşımı fonksiyonları. her biri için ayrı bir kopya için düzenlemek gerekir

function doSetTimeout(i) {
  setTimeout(function() { alert(i); }, 100);
}

for (var i = 1; i <= 2;   i)
  doSetTimeout(i);

Eğer bu (ve bu aynı fikir diğer varyasyonları var) gibi bir şeyler yapmalıyız eğer doğru değilse, o zaman zamanlayıcı işleyicisi işlevleri her biripaylaşınaynı değişken "ben". Döngü tamamlandığında değeri ne "ben"? 3. Aracılık işlevi kullanarak, birkopyaladeğişkenin değerini yapılır. Zaman aşımı işleyicisi anlaşıldı bağlamında oluşturulan bu yana, kendi özel "" kullanın. ben de var

edit&; aynı zamanda bazı karışıklıklar birkaç zaman aşımı ayarlama tüm yangın işleyicileri neden olduğu konusunda çok açıktı zamanla birkaç eleştirim var -. Önemli olan süreci anlamak içinkurmatimer & - setTimeout() - çağrıları; hemen hemen hiç zaman alır. Yani sistem söyleyip, "Lütfen 1000 milisaniye çekim sıraya zaman aşımı isteği yükleme işlemi çok hızlı olarak" hemen dönecek. sonra bu işlevini çağırın

Bir böyleceart ardazaman aşımı istekleri yapılır, bu durumda kod OP ve benim cevap, ve zaman gecikmesi değeri için de durum aynıdır her biri, daha sonra, bu miktarın zaman geçen tüm zamanlayıcı işleyicileri çağrılır sonra başka peş peşe.

Eğer neye ihtiyacınız olduğunu işleyicileri demem aralıklarla, ya da setInterval() çağrılan aynen setTimeout() ama hangi yangın daha sonra bir kez tekrarlanan gecikmeler, talep edilen miktarı ya da bunun yerine kurabilme, zaman aşımı ve çarpın zaman değer yineleme sayacı. Yani, örneğin benim kodunu değiştirmek için:

function doScaledTimeout(i) {
  setTimeout(function() {
    alert(i);
  }, i * 5000);
}

Numarasını çarptım (100 milisaniyelik bir zaman aşımı ile, etkisi çok belirgin olmayacak, 5000.) Değeri i ile çarpılır taban gecikme değeri, bu nedenle arama 5 kez bir döngü sonucu gecikme 5 saniye, 10 saniye, 15 saniye, 20 saniye, 25 saniye.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Elliot Davin

    Elliot Davin

    28 Kasım 2008
  • AutoStream's Garage419

    AutoStream's

    15 EKİM 2007
  • Kindness

    Kindness

    23 Ocak 2006