JavaScript zamanlayıcılarının nasıl uygulanacağı hakkında. JavaScript'te kesmek için daha iyi olan SetTimeOut ve SetInterval? Bir kereden fazla, hatta bir vikonanny koymayın

Golovna / Kişiler

JavaScript zaman aşımı, zaman gecikmesi ayarlandıktan sonra (milisaniye cinsinden) bir kod parçacığı gibi yerel bir javascript işlevidir. Bir coristuvach sizin tarafınızda karanlık bir saat geçirdiği için, bundan sonra bir muzaffer, birleşme yapmak gerekirse, buna değer olabilir. Aksi takdirde, imleç öğenin üzerine getirildiğinde efektin yalnızca bir saat içinde başlaması gerekir. Bu şekilde, imleç vypadkovo'da geziniyormuş gibi, alışılmadık bir başlatma efektinden kaçınabilirsiniz.

Basit bir setTimeout örneği

Bu işlevi göstermek için, düğmeye bastıktan iki saniye sonra parçalanma penceresinin göründüğü demonun başlangıcına hayret etmek istiyorum.

harika demo

Sözdizimi

MDN belgelerinde setTimeout için aşağıdaki sözdizimi bulunur:

var timeoutID = window.setTimeout(işlev, ); var timeoutID = window.setTimeout(kod, );

  • timeoutID - zamanlayıcıyı etkinleştirmek için clearTimeout()'tan bir kerede kötü olabilecek sayısal kimlik;
  • func - işlev, nasıl vikonan olunur;
  • kod( alternatif sözdiziminde) - bir vikonati için gerekli olan bir kod satırı;
  • gecikme - işlev başlatıldıktan sonra milisaniye cinsinden gecikme. 0 değeri, promosyonların arkasında ayarlanır.

setTimeout vs window.setTimeout

Üzerine gelinen sözdiziminde window.setTimeout bozuk. Neden? Niye?

Aslında setTimeout ve window.setTimeout pratikte aynı işlevdir. Bir fark, setTimeout yönteminin başka bir şekilde global pencere nesnesinin gücü olarak galip gelmesi gerçeğinde yatmaktadır.

Özellikle kodu nasıl karmaşık hale getireceğim konusunda endişeliyim. Yakby beni atandı alternatif yöntemÖncelik sırasına göre bilinebilen ve tersine çevrilebilen JavaScript zaman aşımı daha da fazla sorunla karşılaştı.

Pencere nesnesinin yardımcısıyla konuşmak istemiyorum, ama genel olarak, siz kendiniz virishuete, bir tür sözdizimi varto vikoristovuvat.

Victoria'yı uygula

Ayrıca işlevleri adlandırabilirsiniz:

function patlat()( alert("Boom!"); ) setTimeout(patlama, 2000);

Değiştir, işleve nasıl dönülür:

var patlat = function()( alert("Boom!"); ); setTimeout(patlama, 2000);

Veya anonim bir işlev:

setTimeout(function()( alert("Boom!"); ), 2000);

  • Böyle bir kod kötü bir şekilde kabul edilir ve onu modernize etmek veya geliştirmek de zor olacaktır;
  • Varyantı, potansiyel olarak çıldırtıcı olabilecek eval() yöntemine geçirirken;
  • Bu yöntem başkaları için daha iyi uygulanır, bu nedenle sizin için çalıştırmanız gerekir. JavaScript yorumlayıcısı.

Ayrıca kodumuzu test etmek için JavaScript zaman aşımı uyarı yöntemini kullandığımızı unutmayın.

Parametreleri setTimout'a geçirme

Öncelikle ( bundan önce, çapraz tarayıcı) seçenekleri, ardından setTimeout yardımcısı tarafından takip edilen geri arama işlevine parametreleri iletiyoruz.

Saldırgan uygulamada, selamlama dizisindeki farkı görebilir ve setTimeout 1 saniyelik bir gecikmeye ayarlandığından bunu greet() işlevine parametre olarak iletebiliriz:

function selamlama(tebrik)( konsol.log(tebrik); ) function getRandom(arr)( dönüş arr; ) var selamlama = ["Merhaba", "Bonjour", "Guten Etiketi"]; setTimeout(function()( selamla(rastgeleGreeting); ), 1000);

harika demo

Alternatif Yöntem

Cob stat'in üzerine gelinen sözdizimi, JavaScript zaman aşımı geri çağırma işlevine parametreler iletebileceğiniz bir yönteme daha sahiptir. Bu yöntem aksamadan sonra gelen tüm parametreleri görmenin eşiğinde olabilir.

Ön kıçta spiraller çizerek şunları alıyoruz:

setTimeout(selam, 1000, rastgeleTebrik);

Bu yöntem IE 9 ve altında çalışmayacaktır, iletilen de parametreler undefined olarak değerlenir. Vyshennya için Ale sorunları çözüyor MDN - özel politika.

“Bu” ile ilgili sorunlar

setTimeout tarafından çağrılan kod, tıpkı çağıran fonksiyon gibi çalışır. Bu sayede şarkı söyleme problemlerine bağlı kalıyoruz anahtar kelime Bu.

var person = ( firstName: "Jim", tanıtın: function()( console.log("Merhaba, I"m " + this.firstName); ) ); person.introduce(); // Çıktılar: Merhaba, ben" m Jim setTimeout(person.introduce, 50); // Çıktılar: Merhaba, ben tanımsızım

Böyle bir visnovka'nın nedeni, ilk uygulamada bunun person nesnesine, diğer uygulamada ise firstName gücüne sahip global nesne penceresine işaret etmesidir.

Yuvalamadan kurtulmak için aşağıdaki yöntemleri kullanarak hızlandırabilirsiniz:

Primusovo bunun anlamını belirledi

Oluşturduğum yöntem olan bind () yardımıyla çalışmak mümkün mü? yeni özellik, wiki'deki this anahtarının değeri, anahtarın değeri gibi. Bizim bakış açımız nesne kişidir. Sonuç olarak Tse bize şunları verir:

setTimeout(kişi.introduce.bind(kişi), 50);

Not: bağlama yöntemi, ECMAScript 5'teki görünümler tarafından kullanılır; bu, yalnızca mevcut tarayıcılar. Diğerlerinde, yoga zastosuvanni sırasında afedersiniz vikonannya JavaScript "işlev zaman aşımı hatası".

zafer kitaplığı

Birçok kitaplık, cis ile sorunu çözmek için gerekli işlevleri içerir. Örneğin, jQuery.proxy() yöntemi. İşlevi alıp yenisini çevirin, muzaffer bir şarkı söyleme bağlamına sahip olun. Vipad'imizin bir içeriği olacak:

setTimeout($.proxy(kişi.giriş, kişi), 50);

harika demo

Zamanlayıcı Titreşim

setTimeout değerini, clearTimeout() yardım işlevinin arkasındaki zamanlayıcıyı etkinleştirmek için değiştirilebilen sayısal id değerine çevirin:

var timer = setTimeout(myFunction, 3000); clearTimeout(zamanlayıcı);

Ona diy olarak bakalım. Saldırgan popoda, düğmeye basın " geri sayıma başla”, İyi bir vidlik kurtarın. Şarap bittikten sonra, cochens kendi alır. Ayrıca, "düğmesine basın Geri sayımı durdur”, JavaScript zaman aşımı zamanlayıcı sıkıştırılacak ve bırakılacaktır.

harika popo

P_vedemo p_bags

setTimeout asenkron bir işlevdir, yani bir sonraki işleve geçiş satırda geçirilecek ve yalnızca yığın tamamlandıktan sonra sayılacaktır. Bir akış gibi diğer işlevlerle bir gecede çalışamaz.

  • Tip:
  • Kayıtlı: 2014.07.08
  • Gönderiler: 3,896
  • Seviyor: 497

Konu: SetTimeOut ve SetInterval, JavaScript'i hacklemek için daha iyi olan nedir?

Kodun eşit aralıklarla bir kerelik başlatılması için işlev atanır setAralık. Tim'in bir dizi eksiden daha azı yoktur, özellikle farklı tarayıcılardaki davranış maliyeti.

İlk sefer, perakendeci tarafından yaklaşan lansman için zamanlayıcının ayarlandığı anda belirlenir. Küçük bir test yapalım: Birkaç saat, önceki lansmanın koçanı geçtiğini ve bunun sonunu görüyoruz.

var d1 = Yeni Tarih(), d2 = Yeni Tarih(); setInterval(function() ( var d = New Date(); document.body.innerHTML += (d - d1) + " " + (d - d2) + "
// fonksiyonunun koçanına bir işaret koyun d1 = new Date(); while (yeni Tarih() - d1< 200); // ничего не делаем 200 миллисекунд // И в конце функции d2 = new Date(); }, 1000);

Visnovok, farklı bir satırdan başlayarak bilgilendirici olacaktır.

Firefox, Opera, Safari ve Chrome benzer bir duruma sahip olacak: ilk sayı yaklaşık 1000, diğeri - 200 daha az. Vidminnist, rozkidі için daha az önemli olacak. Chrome, en küçük rozkid ve Opera'ya sahiptir.

2 tarafından yanıtla PunBB (PunBB 2017.06.08 16:45 tarafından düzenlendi)

  • Tip: Moskova, Sovkhoznay 3, apt. 98
  • Kayıtlı: 2014.07.08
  • Gönderiler: 3,896
  • Seviyor: 497

Bir şey daha az akılda kalıcı ve daha fazla yaratılmış, ancak bazen büyük bir kalkan, - sistem saatini değiştirme kararlılığı. Yaklaşan bir test nasıl çalıştırılır

setInterval(function() ( document.body.innerHTML = Math.random(); ), 500);

І Lansmandan sonra, sistem saatini whilina'ya aktarın, ardından Firefox tarayıcıları Safari zmina numaraları yapışır ve whilina yeniden başlar. Açıkçası, sistem saatini manuel olarak durumun kenarına çevirmek normaldir, ancak zengin sistemlerde, internetteki sunucularla saat için otomatik senkronizasyon ayarlanmıştır, bu nedenle bu gibi durumlarda bu faktörü atmak mümkün değildir.

setInterval işlevinin bir diğer küçük eksiği, bir çağrı kurmanın mümkün olabilmesidir, burada manuel olarak girdiğiniz tanımlayıcıyı hatırlamanız gerekir.

3 tarafından yanıtla PunBB

  • Tip: Moskova, Sovkhoznay 3, apt. 98
  • Kayıtlı: 2014.07.08
  • Gönderiler: 3,896
  • Seviyor: 497

Re: JavaScript'te ince ayar yapmak daha iyi olan SetTimeOut ve SetInterval?

setInterval'deki eksikliklerden kurtulmak için setTimeout üzerinden kazanabilirsiniz.

setInterval için önemli bir alternatif, özyinelemeli setTimeout'tur:

/** değiştir: var timerId = setInterval(function() ( alert("tic"); ), 2000); */ var timerId = setTimeout(function tick() ( alert("tick"); timerId = setTimeout(tick, 2000); ), 2000);

Daha sonraki bir tarihte, geleceğin sona ermesinden sonra gelecek bir kez daha planlanır.

Özyinelemeli setTimeout - daha esnek zamanlama yöntemi, daha düşük setInterval, bir sonraki son teslim tarihinden bir saat önce, akış sonucuna bağlı olarak farklı bir şekilde planlanabilir.

Örneğin, sunucuyu yeni veriler için 5 saniyeliğine kontrol eden bir hizmetimiz var. Bir yenileme sunucusu olarak, örnekleme aralığını 10, 20, 60 saniyeye kadar artırabilirsiniz… Ve sonra her şey normale dönerse geri dönebilirsiniz.

Düzenli olarak planlama sürecinden geçtiğimiz için, onlar için geri dönüş saatini tahmin edebiliyor ve bir sonraki lansmanı daha erken planlayabiliyoruz.

4 tarafından yanıtla PunBB

  • Tip: Moskova, Sovkhoznay 3, apt. 98
  • Kayıtlı: 2014.07.08
  • Gönderiler: 3,896
  • Seviyor: 497

Re: JavaScript'te ince ayar yapmak daha iyi olan SetTimeOut ve SetInterval?

Özyinelemeli setTimeout, tıklamalar arasında bir duraklamayı garanti eder, setInterval hiçbirini garanti etmez.

İki kodu karşılaştıralım. İlk vicorist setInterval:

var i = 1; setInterval(işlev() ( işlev(i); ), 100);

Başka bir muzaffer özyinelemeli setTimeout:

var i = 1; setTimeout(işlev çalıştır() ( func(i); setTimeout(çalıştır, 100); ), 100);

setInterval ile, dahili zamanlayıcı 100ms'lik net bir süreye ve func(i)'nin geri arama süresine ayarlanır:

setInterval ile func tıklamaları arasındaki gerçek duraklama daha azdır, kodda daha düşük belirtilir!

Doğaldır, robotik işlevin saati korunmasa bile, aralığın bir kısmını "kaybedecektir".

Bu mümkündür ve böylece işlev katlanmış, alçaltılmış ve daha fazla, 100 ms daha düşük sarılmıştır.

Bu durumda, yorumlayıcı, işlev tamamlanana kadar kontrol edilir, ardından setInterval çağrısının saati zaten pіdіyshov (veya atlıyormuş gibi), zamanlayıcı i'yi kontrol edeceğiz, sonra bir sonraki viklik hemen olacaktır.

İşlev daha uzun süre devam ederse, setInterval duraklamasını azaltın, ardından tweet'ler kesintisiz olarak ateşlenecektir.

5 tarafından yanıtla sempai

  • Tip: Kudüs
  • Kayıtlı: 2015.06.02
  • Gönderiler: 958
  • Seviyor: 274

Re: JavaScript'te ince ayar yapmak daha iyi olan SetTimeOut ve SetInterval?

Hepsi zavdannya koydu. SetTimeOut başlığı, zamanlayıcının bir kerelik başlangıcı için, SetInterval ise döngüyü başlatmak için kullanılır. Ancak bu fonksiyon betiklerin döngüsel olarak çalıştırılması için de kullanılabilir, örneğin SetTimeOut fonksiyonunda yinelemeli olarak çalıştırılabilir, o zaman SetInterval'e benzer şekilde daha pratiktir.

Şu anda Eksi SetInterval, betiğin (işlev) kendisi için saat sabit olmadığından ve önemli uygulamalar için kazanırsanız, aralığın saati çok kısa olacaktır ve diğer tarayıcılarda farklı olabilir.

Ama tekrar edeceğim, çünkü fonksiyon veya o minimizasyon isteyecektir, o zaman kіntsevy spzhivach pek fark yok.
Bu scho vikoristovuvati, virishu kozhen'in kendisi

Dzherelo: http://learn.javascript.ru/settimeout-setinterval

Tüm JavaScript uygulamalarının, görevler dönemi boyunca haftalık işlevi ayarlamanıza olanak tanıyan dahili bir zamanlayıcı zamanlayıcısı olabilir.

Zocrema, tarayıcılar ve Node.JS sunucuları tarafından desteklenmektedir.

setZaman aşımı

Sözdizimi:

var timerId = setTimeout(işlev/kod, gecikme[, arg1, arg2...])

parametreler:

  • işlev/kod
    • Görselleştirme için bir işlev veya kod satırı.
    • Summіnostі için satır podtremuєtsya, vikoristovuvat tavsiye edilmez.
  • gecikme
    • Milisaniye cinsinden kırpın, 1000 milisaniye, 1 saniyeye eşittir.
  • arg1, arg2…
    • İşleve iletilmesi gereken bağımsız değişkenler. IE9-'de desteklenmez.
    • Gecikme parametresinin bir etkisi varsa, işlev bir saat içinde sona erecektir.

Örneğin, aşağıdaki kod bir saniye içinde alert("Merhaba") çağırır:

işlev()(alert("Merhaba");) setTimeout(işlev, 1000);

İlk argüman arka arkaya olduğu için yorumlayıcı üçüncü satırda isimsiz bir fonksiyon oluşturur.

Yani böyle bir kayıt şöyle çalışır:

SetTimeout("alert("Merhaba")", 1000);

Bunları anonim işlevlerle değiştirin:

Zamanaşımı Ayarla( işlev()(uyarı ("Merhaba")), 1000);

İşlev ve bağlam için parametreler

IE10'un etkin olduğu tüm modern tarayıcılarda setTimeout, işlev parametrelerini ayarlamanıza olanak tanır.

Popo alt canlı "Merhaba, ben Vasya" kırışık, IE9-:

fonksiyon sayHi(kim)(alert("Merhaba, ben" + kim); ) setTimeout(sayHi, 1000, "Vasya");

…Ancak, görüşlerin çoğu için eski IE'nin desteğine ihtiyacımız var ve argümanların gösterilmesine izin vermiyoruz. Onları iletmek için wiki'yi isimsiz bir işleve sarın:

fonksiyon sayHi(kim)(alert("Merhaba, ben" + kim); ) setTimeout( işlev()(sayHi ("Vasya")), 1000);

Wikiclick, bu bağlamı setTimeout aracılığıyla iletmez.

Zokrema, setTimeout aracılığıyla nesnenin yöntemine global bağlama wickklix. Yanlış sonuçlara yol açabilir.

Örneğin, bir saniyede user.sayHi() diyebiliriz:

işlev Kullanıcı (id) işlev()(alert(bu .id); ); var user = new User(12345); setTimeout(user.sayHi, 1000); // "tanımsız" olmasına rağmen 12345 puan

setTimeout tuşları, user.sayHi işlevini global bağlamda çalıştırır, bir zincir aracılığıyla nesneye erişime izin vermez.

Aksi takdirde, iki setTimeout wiki'nin aynı şekilde çalıştığı görülüyor:

// (1) bir satır setTimeout(user.sayHi, 1000); // (2) aynı iki satır var func = user.sayHi; setTimeout(işlev, 1000);

Neyse ki, bu sorun, ara işlevlerin oluşturulmasıyla da kolayca ihlal edilir:

işlev Kullanıcı (id)(bu .id = id; bu .sayHi = işlev()(alert(bu .id); ); var user = new User(12345); setZaman aşımı( işlev()(user.sayHi(); ), 1000);

Sarma işlevi, tarayıcılar arası bağımsız değişkenleri iletmek ve sarma bağlamını kaydetmek için kullanılır.

Skasuvannya vikonannya

setTimeout işlevi, eşleşmek üzere eşleştirilebilen timerId tanımlayıcısını döndürür.

Sözdizimi:

ClearTimeout(timerId)

Hücum için bir mola belirledik ve sonra bunu gördük (fikrimizi değiştirdik). Sonuç olarak hiçbir şey çıkmıyor.

var timerId = setTimeout( işlev()(uyarı(1)), 1000); clearTimeout(timerId);

setAralık

setInterval yöntemi, setTimeout'a benzer bir sözdizimine sahiptir.

var timerId = setInterval(işlev/kod, gecikme[, arg1, arg2...])

Argüman duygusu aynıdır. Ale, vіdmіnu setTimeout üzerinde, vikonannya funkії çalıştırın, bir kez değil, düzenli olarak bir saatlik aralıklarla tekrarlayın. Zupiniti vikonannya tıklanabilir:

ClearInterval(timerId)

Başlangıçta adım atan popo, iki saniye boyunca bir cilt uyarısı gösterecek, “Durdur” düğmesine tıklamayın:

<giriş tipi ="düğme" onclick ="clearInterval(timer)" değer ="(!LANG:(!LANG:Durdur)" > !}!} <komut dosyası > var i = 1; var timer = setInterval( işlev()(uyarı(i++)), 2000);komut dosyası >

SetInterval'de vitklik_v'nin bindirilmesini sağlayan Cherga

Haftalık setInterval (işlev, zatrymka) bir saat aralığının atanması yoluyla bilgi uçurma işlevini ayarlar. Ale, burada bir incelik var.

Gerçekten, döngüler arasındaki duraklama daha azdır, aralık daha düşüktür.

Örneğin, setInterval(function() ( func(i++) ), 100) alın. Lichnik'in değerini artırmak için 100 ms'lik bir func skin olacaktır.

Biraz daha düşük, kırmızı bir blok - func saati. Blok arasındaki saat - işlevin başlatılması arasında aynı saat ve daha küçük olanı, sıkışma aşağıda kuruludur!

Bu nedenle tarayıcı, işlevin zamanını ayarlamadan 100ms'de yavaşça işlevin başlatılmasını başlatır.

Buvaє, scho vykonannya funktії bir saatten fazla kaplar, anіzh zatrimka. Örneğin, işlev katlanabilir ve dağınıklık küçüktür. Ancak işlev, alarm akışını engelliyormuş gibi uyarı/onayla/isteme operatörlerinin intikamını almaktır. Ve burada tsіkavі rechі başlıyor.

İşlevin başlatılması mümkün değilse, tarayıcı meşguldür, sıraya girer ve tıpkı tarayıcının çağrıları gibi ortaya çıkar.

Aşağıdaki resimler, muzaffer oldukları sürece işlev için gerekli olanları açıklamaktadır.

setInterval'i başlatan haftalık işlevler, eğer yapabilirsek, satıra ve ihmale göre eklenir:

İlki tamamlanır tamamlanmaz işlevin başka bir başlatması gerçekleştirilir:

Bir kereden fazla, hatta bir vikonnanny koymayın.

Bir işlevin yürütülmesi bir saatten fazla sürerse, planlanan işlemlerin sayısı o kadar düşükse, sonunda her şey bir defaya mal olur. Ayrıca, lansmanların "birikimi" gerçekleşmez.

Aşağıdaki resimde setInterval, 200 ms'lik işlevi geciktirmek ve hatta bir uyandırma çağrısı ayarlamak için kullanılır. 300 ms ve 400 ms'de zamanlayıcı tekrar geçilir, ancak başka hiçbir şey geçmez.

Haftalık setInterval(işlev, kekeme) gerçek kekemeliği garanti etmez.

Buvayut dalgalanmaları, eğer gerçek blokaj verilenden daha büyük veya daha az ise. Vzagali bir zatrimka gibi olacağı bir gerçek değil.

İç içe setTimeout'u tekrarla

Vipad'lerde, yalnızca düzenli bir tekrara değil, aynı zamanda başlatmalar arasında bir obov'azkova zatrimine de ihtiyacınız varsa, setTimeout'u dış görünüm viconan işleviyle yeniden eklemeniz gerekir.

Aşağıda 2 saniye aralıklarla ve aralarında uyarı gibi görünen bir popo var.

<giriş tipi ="düğme" onclick ="clearTimeout(timer)" değer ="(!LANG:(!LANG:Durdur)" > !}!} <komut dosyası > var i = 1; var timer = setTimeout( fonksiyon çalıştır()(alert(i++); timer = setTimeout(run, 2000); ), 2000);komut dosyası >

Saatlik satırda, lansmanlar arasında düzeltmeler olacak. 100ms trim için örnek:

Minimum zamanlayıcı gecikmesi

Tarayıcı zamanlayıcısı minimum düzeyde kekeme olabilir. Modern tarayıcılarda yaklaşık sıfırdan 4 ms'ye değişir. Yaşlı insanlar için daha fazlasına sahip olabilir ve 15ms'ye ulaşabilirsiniz.

Standardın arkasında, minimum kekemelik 4 ms'dir. setTimeout(..,1) ve setTimeout(..,4) arasında fark yoktur.

Sıfır zaman aşımına sahip setTimeout ve setInterval davranışlarının tarayıcı özellikleri vardır.

  1. Opera, setTimeout(.., 0) setTimeout(.., 4) ile aynıdır. Daha sonra karşılaştırılabilir, daha düşük setTimeout(.. ,2). Tse sooblivist tsgo tarayıcısı.
  2. saat Internet Explorer boş kekeme setInterval(.., 0) çalışmıyor. Interval'in kendisini ayarlamaya değer, bu kadar. setTimeout(.., 0) iyi çalışıyor.

Spratsovuvannya'nın gerçek frekansı

Spratsovuvannya daha erken zengin olabilir.Bir takım dalgalanmalarda, trim 4ms değil, 30ms veya 1000ms olabilir.

Çoğu tarayıcı (Farsça masaüstü tarayıcıları), sekme etkin olmadığında setTimeout / setInterval'i çalıştırmaya devam eder. Birkaç tanesi (Chrome, FF, IE10) minimum zamanlayıcı frekansını saniyede 1 defaya indirdiğinde. Dışarı çıkmak için, "arka plan" mevduat sahiplerinin bir zamanlayıcısı vardır, ancak nadiren.

Bir dizüstü bilgisayarda pille çalışırken, tarayıcılar frekansı da düşürebilir, böylece kodun kodlanması daha kolay olur ve pil şarjını korur. Özellikle cym vidomy IE. Azalma tarlada birkaç kez nadasa ulaşılabilir. JavaScript işlemcisi tarafından bunaldığınızda, zamanlayıcıları geçersiz kılamayabilirsiniz. Eğer öyleyse, setInterval çalıştırmaları atlanacaktır.

Visnovok: 4ms frekansında, varto oryantasyon, ancak varto açma.

Konsolda Aralıkları Görüntüleme

var timemark = yeni tarih; setZaman aşımı( işlev git()(var diff = new Date - timeMark; // şeytanın zatrymka'sını konsola girin konsol. günlük(fark); // örneğin saati hatırla, // wikiler arasındaki kekemeliği azaltmak için timeMark = yeni Tarih; setTimeout(git, 100); ), 100);

setTimeout(işlev, 0) hile

Bu numara JavaScript hack'lerinin yıllıklarına gidecek.

İşlev, akış betiği sona erdikten sonra çalıştırmak istediğiniz için setTimeout(func, 0) ile sarılır.

Sağda, setTimeout hiçbir şekilde işlevi ilk etapta yenmez. Vіn daha az planuє її vikonannya. Ale, JavaScript yorumlayıcısının zamanlanmış işlevleri geçersiz kılma olasılığı, akış komut dosyasını geçersiz kılmaya göre daha fazladır.

Standardın arkasında, setTimeout herhangi bir zamanda timeout'tan 0'a kadar olan fonksiyonu geçersiz kılamaz. Daha önce de söylediğimiz gibi timeout 4ms olur. Ale smut, herhangi bir zamanda vikonnannya olacak olanlar, akış kodunun vikonannia'sını takip edecekler.

Örneğin:

varresult; işlev gösterSonuç()(alert(sonuç); ) setTimeout(showResult, 0); sonuç = 2 * 2; // canlı 4

bir arada

setInterval(func, delay) ve setTimeout(func, delay) yöntemleri, func'un düzenli olarak/her gecikme milisaniyesinde bir kez çalışmasına izin verir.

Zamanlayıcı tanımlayıcısını döndürmenin iki yöntemi vardır. Fermuar için hızlı tıklama clearInterval/clearTimeout'u kullanabilirsiniz.

| | ayar aralığı | setZaman aşımı | || ----------- | ---------- | | zamanlama | Ide viklik kesinlikle zamanlayıcının arkasında. Meslek tercümanı olarak, bir hafta siyahta kaybolur. Fonksiyonun bitiş saati garanti edilmez, bir başlatmanın tamamlanmasından sonraki koçanına kadar olan aralık değiştirilebilir. | Özyinelemeli haftalık setTimeout, döngüler arasında bir duraklamanın gerekli olduğu setInterval öğesini geçersiz kılar. | | Minimum kırpma: 4 ms. | Minimum solma: 4ms. | | tarayıcı özellikleri | IE 0 kekeme kullanmaz.Opera'da 4ms'ye eşdeğer sıfır kekeme vardır, saplamalar standart olmayan 1ms, 2ms ve 3ms dahil tam olarak işlenir. |

bu setAralık() yöntemi, pencere ve çalışan arabirimlerine yayılır, her çağrı arasında sabit bir zaman gecikmesiyle art arda bir işlevi çağırır veya bir kod parçacığını yürütür. Bu, neob dilinin aralığı tanımladığı bir ID aralığına dönüşür, böylece callinterval() yardımıyla bu terime atlayabilirsiniz. Bu yöntem, WindowsOrWorkerGlobalScope karışımının yardımına bağlıdır.

Sözdizimi

varintervalID = dürbün.setInterval( işlev, gecikme, [arg1, arg2, ...]); varintervalID = dürbün.setInterval( kod, gecikme);

parametreler

func Her gecikme milisaniyesinde yürütülecek bir işlev. Bu işlev, bir tür düşünce olsun, tekrarlanmaz ve yenilenen anlam değil, ortaya çıkar. kod İsteğe bağlı ek sözdizimi için, daraltılabilir ve viconanimous dış görünümü milyononivcon'a eşit olan işlev yerine dize ekleyebilirsiniz. Tsei sözdizimi tavsiye edilmez eval() kullanımını bir güvenlik riski yapan aynı nedenlerle. gecikme Milisaniye cinsinden süre (bin iki), zamanlayıcı belirtilen işlev veya kodun yürütülmesi arasında gecikmelidir. Atanan gecikme değerleriyle ilgili ayrıntılara tıklayın. arg1, ..., argN Tarafından belirtilen işleve iletilen İsteğe Bağlı Ek bağımsız değişkenler işlev zamanlayıcı sona erdiğinde.

Not: İlk sözdiziminde setInterval() öğesine ek bağımsız değişkenler iletmek, Internet Explorer 9 ve önceki sürümlerde çalışmaz. Polyfill'den sorumlu olduğunuz tarayıcıya bazı işlevler vermeye çalışırken (bölüme bakın).

geri dönüş değeri

intervalID, setInterval() çağrısı tarafından oluşturulan zamanlayıcıyı tanımlayan sıfır olmayan sayısal bir değerdir; bu değer, zaman aşımını iptal etmek için iletilebilir.

setInterval() ve setTimeout()'un aynı kimlik havuzunu paylaştığından emin olmak verimli olabilir ve clearInterval() ve clearTimeout() teknik olarak birbirinin yerine kullanılabilir. Ancak netlik açısından, kodunuzu korurken karışıklığı önlemek için eşleştirmeye çalışmaktan siz sorumlusunuz.

Not: Gecikme bağımsız değişkeni işaretli bir 32 bit tam sayıya dönüştürülür Etkin terim toplamı 2147483647 ms'ye kadar çıkar, bu nedenle gecikme bağımsız değişkeninin IDL'de bir tanımlayıcı olduğu varsayılır.

Örnekler

Örnek 1: Temel sözdizimi

Sonraki adımlar setInterval() "'in temel sözdizimini gösterir.

Var intervalID = window.setInterval(myCallback, 500, "Parametre 1", "Parametre 2"); function myCallback(a, b) ( // Buradaki kodunuz // Parametreler tamamen isteğe bağlıdır. console.log(a); console.log(b); )

Örnek 2: Değişen iki renk

Ardından, Dur düğmesine basılana kadar flashtext() işlevini bir saniyeliğine hatırlayın.

setInterval/clearInterval örneği

Selam Dünya

Örnek 3: Daktilo simülasyonu

Footsteps, belirli bir seçici grubuyla eşleşen içeriği silip yavaşça NodeList'e yazarak daktiloyu simüle eder.

JavaScript Daktilo - MDN Örneği

Mozilla Developer Network tarafından CopyLeft 2012

[ Oyna | Duraklat | sonlandırmak ]

Fringilla lectus imperdiet'te Vivamus blandit massa ut metus mattis. Proin ac ante a felis ornare araç. Arka arkaya lacus vitae eros convallis ut mollis magna pellentesque. Lacus ultricies vitae facilisis nisi fringilla'da Pellentesque placerat enim. Tincidunt tincidunt tincidunt.

JavaScript Daktilo

Lorem ipsum dolor sit amet, conectetur adipiscing elit. Nullam ultrices dolor ac dolor imperdiet ullamcorper. Suspendisse quam libero, luctus auctor mollis sed, maleuada condimentum magna. Ante tellus'ta Quisque, placerat est'de. Pellentesque sakini morbi tristique senectus ve netus ve maleuada ünlüleri ac turpis egestas. Çok iyiyim, çok iyiyim. Etiam sit amet ligula quis urna auctor imperdiet nec faucibus ante. Mauris vel consectetur dolor. Nunc eget elit eget velit pulvinar fringilla conectetur aliquam purus. Curabitur convallis, justo posuere porta egestas, velit erat ornare tortor, viverra justo diam eget arcu yok. Phasellus adipiscing fermentum nibh ac commodo. Nam turpis nunc, hendrerit vitae, volutpat non ipsum.

Phasellus ac nisl lorem:

Duis lobortis sapien quis nisl luctus porttitor. Dönem libero, eu tincidunt dolor eleifend sit amet. Ut nec velit in dolor tincidunt rhoncus non-diam. Morbi auctor ornare orci, euismod olmayan felis gravida nec. Curabitur elementum nisi ve eros rutrum nec blandit diam placerat. Aenean tincidunt risus ut nisi conectetur cursus. Ut özgeçmiş quam elit. Donec dignissim quam tempor consequat içinde tahmin. Aliquam aliquam diam non felis convallis suscipit. Sıfır kolaylık. Donec lacus risus, dignissim ve fringilla ve egestas veleros. Duis maleuada accumsan dui, in fringilla mauris bibStartum quis. Cras adipiscing ultricies fermentum. Praesent bibStartum condimentum feugiat.

Nam faucibus, ligula eu fringilla pulvinar, lectus tellus iaculis nunc, vitae scelerisque metus leo non metus. Proin mattis lobortis lobortis. Quisque accccsan faucibus erat, vel varius tortor ultricies ac. Lorem ipsum dolor sit amet, conectetur adipiscing elit. Sed nec libero nunc. Nullam tortor nunc, elementum a consectetur et, ultrices eu orci. Lorem ipsum dolor sit amet, conectetur adipiscing elit. Pellentesque bir nisl eu sem vehicula egestas.

geri arama argümanları

İleriye bakıldığında, Internet Explorer 9 setTimeout() veya setInterval() içindeki geri arama işlevlerine bağımsız değişkenler iletmeyi düşünmez bile. Aşağıdaki IE'ye özgü Bu değiş tokuşun üstesinden gelmek için bir yöntem göstermek için kod. Hacklemek için, bir sonraki kodu komut dosyasının en üst penceresine hızlandırmak.

/*\ |*| |*| |*| javascript zamanlayıcılarının geri çağırma işlevleri (HTML5 standart sözdizimi)..setInterval |*| https://website/Kullanıcı:fusionchess |*| |*| Sözdizimi: |*| var timeoutID = window.setTimeout(işlev, gecikme[, arg1, arg2, ...]); |*| var timeoutID = window.setTimeout(kod, gecikme); |*| var intervalID = window.setInterval(işlev, gecikme[, arg1, arg2, ...]); |*| var intervalID = window.setInterval(kod, gecikme); |*| \*/ if (document.all && !window.setTimeout.isPolyfill) ( var __nativeST__ = window.setTimeout; window.setTimeout = işlev (vCallback, nDelay /*, argümanToPass1, argümanToPass2, vb. */) ( var aArg .prototype .slice.call(argümanlar, 2); if (document.all && !window.setInterval.isPolyfill) ( var __nativeSI__ = window.setInterval; window.setInterval = işlev(vCallback, nDelay /*, argümanToPass1, argümanToPass2, vb. * /) ( var aArgs = Ar dilim.call(argümanlar, 2);

Anonim işlevleri kullanmak, geri aramanızı aramak için daha fazla seçenek, ancak çözüm biraz daha pahalı. Örnek:

Var intervalID = setInterval(function() ( myFunc("bir", "iki", "üç"); ), 1000); var intervalID = setInterval(işlev(arg1) ().bind(tanımsız, 10), 1000);

Etkin olmayan sekmeler

Gecko 5.0 gerektirir (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)

Gecko 5.0'dan (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2) başlayarak, terimler etkin olmayan sekmelerde saniyede bir defadan fazla olmayacak şekilde sıkıştırılmıştır.

"Bu" sorunu

Yöntemi her zaman setInterval()'den önce iletmelisiniz veya başka bir işlev olsun, geçerli değerlerle değişiklikler yapmanız gerekecektir. JavaScript referansındaki ayrıntıları gözden geçirelim.

Açıklama

setInterval() tarafından yürütülen kod, çağrıldığı işlevden ayrı bir yürütme bağlamında çalışır. Son çare olarak, belirtilen işlev için anahtar sözcük, setTimeout adlı işlevin değeriyle aynı olmayan pencere (veya Global) nesnesine atanmalıdır. Basamak poposuna basın (setInterval() yerine setTimeout() gibi - aslında tüm zamanlayıcılar için güç):

MyArray = ["sıfır", "bir", "iki"]; myArray.myMethod = function (sProperty) ( alert(arguments.length > 0 ? bu : bu); ); myArray.myMethod(); // "sıfır, bir, iki" yazdırır myArray.myMethod(1); // "bir" yazdırır setTimeout(myArray.myMethod, 1000); // 1 saniye sonra "" yazdırır setTimeout(myArray.myMethod, 1500, "1"); // 1,5 saniye sonra "tanımsız" yazdırır // "bu" nesneyi .call ile geçirmek işe yaramaz // çünkü bu setTimeout'un içindeki bunun değerini değiştirir // biz bunun değerini myArray içinde değiştirmek istediğimizde .myMethod // aslında, şarap setTimeout kodu için yanlış olmaktan suçludur, bunun pencere nesnesi olmasını bekler: setTimeout.call(myArray, myArray.myMethod, 2000); // hata: "NS_ERROR_XPC_BAD_OP_ON_WN_PRO nesnesi" setTimeout.call(myArray , myArray.myMethod, 2500, 2); // aynı hata

Gördüğünüz gibi, bir JavaScript ittifakında nesnenizi geri çağırma işlevlerine getirmenin bir yolu yoktur.

Olası bir çözüm

Gücü değiştirmenin olası bir yolu, iki doğal setTimeout() veya setInterval() global işlevini iki yerli olmayan Function.prototype.call yöntemi aracılığıyla çağrılmalarını sağlayanlar. Aşağıdaki örnek olası bir değiştirmeyi gösterir:

// JavaScript zamanlayıcıları aracılığıyla "bu" nesneye atlamaya izin verir var __nativeST__ = window.setTimeout, __nativeSI__ = window.setInterval; window.setTimeout = fonksiyon (vCallback, nDelay /*, argümanToPass1, argümanToPass2, vb. */) ( var oThis = this, aArgs = Array.prototype.slice.call(argümanlar, 2); return __nativeST__(vCallback in? () ( vCallback.apply(oThis, aArgs); ) : vCallback, nDelay); ); window.setInterval = işlev (vCallback, nDelay /*, argümanToPass1, argümanToPass2, vb. */) ( var oThis = this, aArgs = Array.prototype.slice.call(argümanlar, 2); return __nativeSI__(vCallback in () ( vCallback.apply(oThis, aArgs); ) : vCallback, nDelay); );

İki değişiklik de IE'deki geri arama işlevleri zamanlayıcılarına HTML5 standart geçiş keyfi argümanları oluşturur. Yani olarak kullanılabilirler standart dışı ayrıca polyfill'ler. için bkz. standart uyumluçoklu dolgu.

Yeni özellik testi:

MyArray = ["sıfır", "bir", "iki"]; myArray.myMethod = function (sProperty) ( alert(arguments.length > 0 ? bu : bu); ); setTimeout(uyarı, 1500, "Merhaba dünya!"); // Standart victoria setTimeout ve setInterval korunur, ancak... setTimeout.call(myArray, myArray.myMethod, 2000); // 2 saniye sonra "sıfır, bir, iki" yazdırır setTimeout.call(myArray, myArray.myMethod, 2500, 2); // 2,5 saniye sonra "iki" yazdırır

Daha karmaşık ama yine de modüler versiyonu için ( arka plan programı) JavaScript JavaScript Daemons Yönetimi . Bu daha büyük daraltılabilir sürüm, yalnızca büyük ve geniş bir yöntemler koleksiyonu değildir. arka plan programı yapıcı. Ancak arka plan programı yoga yapıcısının kendisi bir klondan başka bir şey değildir Mini Daemon için ek bir destek ile içinde ve Başlat işlevlerin bildirilebilir somutlaştırılması arka plan programı . Böylece Mini Daemonçerçeve basit animasyonlar için önerilen yol olmaya devam ediyor, çünkü arka plan programı bu yöntem koleksiyonu olmadan, yalnızca bir klonudur.

minidaemon.js

/*\ |*| |*| :: MiniDaemon:: |*| |*| Revizyon #2 - 26 Eylül 2014.setInterval |*| https://website/Kullanıcı:fusionchess |*| https://github.com/madmurphy/minidaemon.js |*| |*| Bu çerçeve, GNU Kısıtlı Genel Kamu Lisansı, sürüm 3 veya üstü kapsamındadır. |*| http://www.gnu.org/licenses/lgpl-3.0.html |*| \*/ function MiniDaemon (oOwner, fTask, nRate, nLen) ( if (!(this && this instanceof MiniDaemon)) ( return; ) if (arguments.length< 2) { throw new TypeError("MiniDaemon - not enough arguments"); } if (oOwner) { this.owner = oOwner; } this.task = fTask; if (isFinite(nRate) && nRate >0) ( this.rate = Math.floor(nRate); ) if (nLen > 0) ( this.length = Math.floor(nLen); ) ) MiniDaemon.prototype.owner = null; MiniDaemon.prototype.task = boş; MiniDaemon.prototype.rate = 100; MiniDaemon.prototype.length = Sonsuz; /* Bu özellikler salt okunur olmalıdır */ MiniDaemon.prototype.SESSION = -1; MiniDaemon.prototype.INDEX = 0; MiniDaemon.prototype.PAUSED = doğru; MiniDaemon.prototype.BACKW = doğru; /* Genel yöntemler */ MiniDaemon.forceCall = function(oDmn) (oDmn.INDEX += oDmn.BACKW ? -1: 1; if (oDmn.task.call(oDmn.owner, oDmn.INDEX, oDmn.length, oDmn) .BACKW) === false || oDmn.isAtEnd()) ( oDmn.pause(); /* Örnek yöntemleri */ MiniDaemon.prototype.isAtEnd = function () ( this.BACKW ? isFinite(this.length) döndür && bu.INDEX< 1: this.INDEX + 1 >this.uzunluk; ); MiniDaemon.prototype.synchronize = function () ( if (this.PAUSED) ( dönüş; ) clearInterval(this.SESSION); this.SESSION = setInterval(MiniDaemon.forceCall, this.rate, this); ); MiniDaemon.prototype.pause = fonksiyon () ( clearInterval(this.SESSION); this.PAUSED = true; ); MiniDaemon.prototype.start = function (bReverse) ( var bBackw = Boolean(bReverse); if (this.BACKW === bBackw && (this.isAtEnd() || !this.PAUSED)) ( return; ) this.BACKW = bBackw;this.PAUSED = false;this.synchronize(); );

MiniDaemon, argümanları geri çağırma işlevine iletir. Doğal olarak bu özelliği desteklemeyen tarayıcılarla yeni bir şey üzerinde çalışmayı seçerseniz, geliştirilen yöntemlerden birini seçin.

Sözdizimi

var myDaemon = New MiniDaemon( bu nesne, geri aramak[ , oran [, uzunluk]]);

Tanım

Kullanım notları

SetInterval() işlevi, kural olarak, animasyonlar vb. gibi işlevler için eylemleri ayarlamak için kullanılır. WindowsOrWorkerGlobalScope.clearInterval() öğesini çağırarak saati açabilirsiniz.

Eğer isterseniz fonksiyonunuz çağrılır bir Zamanlar belirtilen gecikmeden sonra kullanın.

Gecikme kısıtlamaları

Alternatif olarak, setInterval() için geri arama, setInterval() çağrısını başka bir terimi çalıştırmak üzere çevirmek için kullanılabilir, bu nedenle ilk giden olacaktır.Performans, aralıklar beş seviyenin ötesine yuvalandığında, tarayıcı otomatik olarak 4 ms'yi zorlar. aralık için minimum değer.

Suçlu olmak istemiyorsanız, tarayıcılar belirli koşullar altında terim için daha katı minimum değerler biliyor olabilir. Ayrıca, geri arama çağrıları arasında geçen gerçek sürenin, verilen gecikmeden daha uzun olabileceğini unutmayın; Örnekler için WindowOrWorkerGlobalScope.setTimeout() içinde belirtilenden daha uzun gecikme nedenleri'ni seçin.

Yürütme süresinin aralık frekansından daha kısa olduğundan emin olun

Mantıklı olanınızın bir saatten az bir süre sonra galip gelmesi mümkün olsa da, yinelemeli çağrı yapmanız ve setTimeout() işlevinin çağrılmış olması mümkündür. Örneğin, bir kural olarak, setInterval() uzak bir sunucuda polo yapmak için 5 saniye sürer, geçersiz bir sunucuda bir terimdir ve ana bilgisayar, daha fazla bildirimde bulunarak, son bir saatte tamamlanması için çağrı yapabilir. Bu nedenle, XHR'ye ihtiyacınız olduğu ve sırayla geri yüklemeniz gerektiği gösterilebilir.

JavaScript zamanlayıcılarının nasıl kullanılacağını anlamak önemlidir. Çoğu zaman, davranışımız zengin akışa karşı sezgisel duyarlılığımızdan kopmaz ve bununla bağlantılıdır, koku gerçekten tek bir terle sarılır. Zamanlayıcıları kullanabileceğimiz bazı fonksiyonlara bir göz atalım:

  • var id = setTimeout(fn, gecikme); - Belirli bir kekemelikten sonra işlevi etkinleştiren basit bir zamanlayıcı oluşturun. İşlev, yardımı için zamanlayıcının atanabileceği benzersiz bir kimliği döndürür.
  • var id = setInterval(fn, gecikme); - setTimeout'a benzer, ancak belirli bir aralıkta (çağrılana kadar) işlevi sürekli olarak çağırır.
  • clearInterval(id); clearTimeout(id); - Kimlik zamanlayıcısını kabul eder (yukarıda açıklanan işlevlerden birini döndürür) ve "a.
İyi bir fikir, eğer bakarsanız, zamanlayıcının kırpma süresinin doğruluğu garanti edilmiyor gibi görünüyor. İyi bir nedenle, tarayıcı tüm asenkron JavaScript alt öğelerini tek bir iş parçacığında (fare veya zamanlayıcı tıklaması gibi) ve yalnızca bir sonraki sefer için zaman geldiyse, o saatte vicon'lar. Bir sonraki diyagram en iyisini gösterir:

Küçük birine çok fazla bilgi vermek, nasıl elde edileceğini, ancak JavaScript'in çalışma mekanizmasını ve eşzamansızlığını daha iyi anlamanızı sağlamak için. bu diyagramda saat ve milisaniyelerin dikey temsilleri, mavi bloklar zaten görülebilen JavaScript kod bloklarını gösterir. Örneğin, ilk blok 18 ms'de tetiklenir, fare tıklaması yaklaşık 11 ms'de engellenir.

JavaScript, diğer eşzamansız alt yordamları engellerken yalnızca bir kod yığınını geçersiz kılabilir (geçersiz kılmanın tek iş parçacıklı yapısı aracılığıyla). Bu, asenkron alt (bir fare tıklaması, bir zamanlayıcı tıklaması veya tamamlanmış bir XMLHttp tamamlaması gibi) başarısız olduğunda, satıra ekleneceği ve daha sonra (uygulama, açıkçası, tarayıcının geri dönüşüne göre değişir, ama açık olalım).

Her şeyden önce, JavaScript bloğunun ortasından iki zamanlayıcının başladığı açıktır: 10ms gecikmeli setTimeout ve aynı gecikmeli setInterval. Zamanlayıcı başladığında, kodun ilk bloğu henüz tamamlanmadıysa, anı kaydedeceği gerçeğine bağlı olarak. Ancak, VIN'in doğrudan kullanılamayacağını unutmayın (tek iş parçacığı ile mümkün değildir). Natom_st v_dkladen işlevi, bir sonraki uygun anda siyah ve vykonuєtsya'da tüketilir.

Ayrıca, ilk JavaScript bloğunun ilk saatinin altında, fareye tıklamayı suçlayın. Obrobnik asenkron podії (ama asenkron, bu yüzden iletemeyiz) şu anda kesinti olmadan dövülemez, bu yüzden aynı zamanda bir zamanlayıcı gibi hatta harcanır.

Bundan sonra, göz kırpmanın JavaScript kodunun ilk bloğu olarak, tarayıcı “Kazanmayı kim kontrol ediyor?” Sorusunu sorar. Aynı zamanda, koleksiyoncu fareye tıklar ve istasyonda zamanlayıcı azarlanır. Tarayıcı bunlardan birini (tıklayıcı) seçer ve kazanır. Zamanlayıcı, bir sonraki saatte saatin kullanılabilir bölümünü kontrol eder.

Farenin tıklama yakalaması hala çalışırken, ilk aralıklı geri aramayı kullanın. Yani bu tıpkı bir zamanlayıcı geri araması gibi, siyahtan emirler olacak. Prote, tekrar spratsyuє intervali yaparsam (zamanlayıcı-geri arama mevcut olana kadar), kazancın çizelgelerden silineceğini kontrol edin. Yakby tüm aralıklı geri arama" ve büyük kod parçası kontrol edilene kadar kuyrukta israf edildi, bu, bir grup işlevin kurulmuş olmasına, aramanın sona ermesi arasında gecikme süreleri olmadan kontrol edilmesine yol açacaktı. ilk önce alttaki çizime bir tane daha ekleyin.

Bu andan sonra üçüncü aralıklı geri arama gerçekleşirse, arıza zaten atılmışsa bir düşüşe dikkat edebiliriz. Bu önemli bir özelliği anlatmaktır: Aralar bir anda galip gelenlere fırsat vermez, vikonannyami arasındaki zatrim periyodu dengelenmeden sıraya eklenecektir.

Nareshti, başka bir aralıklı geri arama tamamlandıktan sonra, JavaScript motorunun suçlanacağı hiçbir şeyin bırakılmadığını umuyoruz. Bu, tarayıcının yeni asenkron aboneleri tekrar kontrol edeceği anlamına gelir. 50ms olarak ayarlanmalıdır, aralıklı geri arama yeniden başlayacaktır. Şu anda yogayı engelleyecek hiçbir şey olmayacak, bunun için işe yaramayacak.

setTimeout ve setInterval arasındaki farkı gösteren bir örneğe bakalım.
setTimeout(function()( /* Uzun bir kod bloğu... */ setTimeout(arguments.callee, 10); ), 10); setInterval(function()( /* Uzun bir kod bloğu... */ ), 10);
Bu iki seçenek ilk bakışta eşdeğerdir, ancak gerçekte değildirler. Sonraki döngüden sonra gecikme süresini 10ms'ye ayarlamak için Timeout'u setTimeout'a ayarlayacak kod (daha büyük olabilir, ancak daha küçük olamaz), otomatik olarak kaplamayı çağıracak olan setInterval'i setInterval'e ayarlayacak kodla aynıdır. 10ms ileri, kez sayısına bağlı olarak.

Söylenen her şeyi tekrarlayalım:
- JavaScript motorları, asenkron girdileri temizlenmiş bir satıra dönüştüren tek iş parçacıklı bir ara katman yazılımıdır.
- setZaman aşımı işlevleri ve setInterval asenkron kodda temelde farklıdır,
- Zamanlayıcı bu anda geçilemezse, bir sonraki mola noktasından önce atılır (bağan zatrimka için yapılacağı gibi),
- Aralıklar (setInterval), bir saatten fazla sürdüğü için kekemelik olmadan tek tek çevrilebilir, aşağıda bir kekemelik atanmıştır.

Her şey üstte önemli bilgi kırmak için. JavaScript motorunun nasıl çalıştığını bilmek, özellikle çok sayıda asenkron alt bölmenin (genellikle kullanılan) bilinmesi, ilham verici eklemeler için temel oluşturur.

© 2022 androidas.ru - Android hakkında her şey