Menu
CoddyTech

Olay Döngüsü

Coddy'nin Node.js Journey'sinin Node.js Temelleri bölümünün bir parçası. Ders 26 / 33.

Geri çağırmalar ve vaatler daha sonra çalışır; ne zaman çalışacaklarını tam olarak bilmemekten kaynaklanan hatalar gizlenir.

Node önce tüm eşzamanlı kodu sonuna kadar çalıştırır. Ardından mikro görevleri çalıştırır: vaat geri çağırmalarını ve queueMicrotask öğesine aktarılan işlevleri. Zamanlayıcılar ancak bundan sonra çalışır. setTimeout(fn, ms), fn işlevini ms milisaniye sonra bir kez çalıştırır. setTimeout(fn, 0) bile mikro görevler bitene kadar bekler.

setTimeout(() => console.log('C timer'), 0);
Promise.resolve().then(() => console.log('B promise'));
console.log('A sync');
// A sync, B promise, C timer

0 gecikme, mikro görevlerden sonra mümkün olan en kısa sürede çalışması anlamına gelir; onlardan önce asla çalışmaz. Zamanlayıcılar gecikme sürelerine göre tetiklenir; gecikmeler eşitse önce ayarlanan zamanlayıcı önce çalışır.

challenge icon

Görev

Kolay

Node kodunu belirli bir sırayla çalıştırır. Önce normal satırlar, sonra promise geri çağırmaları gibi mikro görevler, ardından zamanlayıcılar çalışır. Dört satırın yerlerini değiştirmeden sayı sırasına göre yazdırmak için bu sırayı kullan.

order.js dört satırını 4'ten 1'e doğru yazdırır. Satırları taşıma veya yeniden sıralama. Bunun yerine, üçünü daha sonra çalışacak şekilde sarmala.

  1. console.log('1 sync') satırını olduğu gibi bırak. Normal kod önce çalışır.
  2. 2 microtask satırını queueMicrotask ile sar; böylece normal kodun hemen ardından çalışır.
  3. 3 timeout satırını ve 4 timeout later satırını ayrı ayrı kendi setTimeout çağrılarıyla sar. setTimeout(fn, ms), fn işlevini ms milisaniye sonra bir kez çalıştırır. 4. satır 3. satırdan önce ayarlanır, bu nedenle daha uzun bir gecikmeye ihtiyaç duyar.

node order.js komutu ardından şunu yazdırır:

1 sync
2 microtask
3 timeout
4 timeout later

Deneyin: çalıştırmadan önce sırayı tahmin et. Ardından “Oyna” düğmesine bas; terminalde $ node order.js görünür. Sonra her iki zamanlayıcıya da 0 gecikme verip yeniden çalıştır: artık 4 timeout later, 3 timeout satırından önce yazdırılır; çünkü gecikmeler eşit olduğunda önce ayarlanan zamanlayıcı önce çalışır. “Kontrol et” düğmesine basmadan önce 4. satırdaki uzun gecikmeyi geri koy.

Kendin dene

// Bu satırların yerlerini değiştirmeden numara sırasına göre yazdırılmasını sağlayın.
// Bunun yerine onları queueMicrotask ve setTimeout içine alın.
console.log('4 timeout later');
console.log('3 timeout');
console.log('2 microtask');
console.log('1 sync');
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Node.js Temelleri bölümündeki tüm dersler

Kendi başına pratik yap: Express playground