Hangi Javascript fonksiyonlarının bloke edilmemeye karşı bloke olduğunu belirler?


27

Birkaç yıldır web tabanlı Javascript (vanilla JS, jQuery, Backbone vb.) Yapıyorum ve son zamanlarda Node.js. ile bazı çalışmalar yapıyorum. Bloke etmeyen programlamanın askıya alınması biraz zaman aldı, ancak şimdi GÇ işlemleri için geri aramaları kullanmaya alışmaya başladım.

Javascript’in doğası gereği tek dişli olduğunu anladım. "Olay sırası" düğümü kavramını anlıyorum. Anlamadığım şey, bireysel bir javascript işleminin "engelleme" ile "engellemememe" olup olmadığını belirleyen şey. Daha sonraki kodda kullanmam için hangi işlemleri eş zamanlı olarak bir çıktı üretmeye dayanabileceğimi ve ilk işlemleri tamamladıktan sonra çıktıyı işleyebilmem için hangilerini geri çağırmaya ihtiyacım olacağını nasıl bilebilirim? Asenkron / engelleyici olmayan bir yerde bir Javascript işlevi listesi ve senkronize / engelleyici bir listesi var mı? Javascript uygulamamın dev bir yarış koşulu olmasını engelleyen nedir?

Düğümdeki G / Ç işlemleri ve web'deki AJAX işlemleri gibi uzun zaman alan işlemlerin eşzamansız olmalarını gerektirdiğinden ve bu nedenle geri arama kullanmalarını gerektirdiğini biliyorum - ama kimin "uzun süre" olarak nitelendirilebileceğini kim belirliyor? Bu işlemlerde onları normal "olay kuyruğundan" kaldıran bir tür tetikleyici var mı? Değilse, değişkenlere değer atamak veya dizilerden döngü yapmak gibi basit işlemlerden farklı kılan şey, senkronize bir şekilde bitirmeye bağlı olabileceğimiz gibi görünüyor?

Belki de bunu doğru düşünemiyorum bile - birinin beni düzeltebileceğini umuyorum. Teşekkürler!


Bu soruya cevabınız, yöntemlerin zaman uyumsuz olup olmadığını bulmak için belgeleri kontrol etmeniz gerekmesine rağmen, gerçekten yararlı olduğunu düşündüğüm bir şey.
Anastasios Andronidis

Yanıtlar:


13

Genel olarak, bir süre boyunca işleri yapmak için ağ yapan veya zamanlayıcıları kullanan herhangi bir fonksiyon, zaman uyumsuz olacaktır.

İşlev bir geri arama alırsa, geri aramanın ne için kullanıldığına bakabilirsiniz ve genellikle zaman uyumsuz olup olmadığı açıktır. İşlev bir geri arama sunmuyorsa, zaman uyumsuz sonuçları iletme yolu yoktur, bu nedenle muhtemelen zaman uyumsuz değildir.

Kesin söylemenin kesin bir yolu yok. Bir fonksiyon için dokümanda belirtilmelidir veya arayüzün çalışma şeklinden açıkça anlaşılmalıdır.

Asenkron işlemler, kapaklar altında, asenkron işlemlerin bir işlem kurma, işlemi başlatma ve daha sonra işlemin ilerlemesi, tamamlanma veya hataları bildirme fikrinin olduğu senkronize işlemlerden farklıdır. Bir diziyi yinelemek eşzamanlı bir işlemdir. Bunların hiçbiri yok. Kod sadece eşzamanlı olarak çalışır. Bir ajax aramasının yapılması, durum bildirimleri için bir geri aramanın kaydedilmesini, ardından ajax aramasının başlatılmasını, daha sonra başka bir javascript çalıştırmaya devam edilmesini ve bir süre sonra geri aramaya, ajax aramasında (tamamlanma gibi) bir durum değişikliği ile çağrılmayı içerir.


1
Ek bir not olarak, bazı Javascript işlevleri parametrelerine bağlı olarak hem engelleme hem de engelleme işlevini yerine getirir. Örneğin , sonraki çağrının eşzamansız olup olmadığını kontrol eden XMLHttpRequest.openbir boolean asyncparametresi vardır send.
Brian

Sadece bu cevabı yararlı bulmadım ve genel olarak açıkladım.
Mehdi Raash

@MehdiRaash - Bunun cevabı belgelerden veya arayüzden anladığınızdır. Başka yolu yok. Bu öyle diyor. Başka ne bekliyordun emin değilim. Sihirli mermi cevabı yok.
jfriend00

6

Anladığım kadarıyla, neleri asenkronize etmeniz gerektiğini değil, bir fonksiyonun asenkronize olup olmadığını nasıl söyleyeceğinizi sormuyorsunuz .

Belgeleri kontrol et. Cidden - bunun için var. Bir işlevin adını veya içeriğini temel alarak bu şekilde yaptığını tahmin edemezsiniz. Emin değilseniz ve kaynak koduna erişiminiz varsa bunu kontrol edin.

Bu tamamen güvenilir bir yol.

Şimdi tahmin için.

  • Bir geri arama kabul ederse veya bir söz verirse, muhtemelen eşzamansızdır (Bu kural için istisnalar gördüm)
  • Genellikle node.js ile ilişkili ve daha genel olarak JavaScript ile ilgili G / Ç ile ilgili her şey zaman uyumsuz olarak yapılır (Ben de bu kuralın istisnalarını gördüm)

4

JavaScript tek dişli olduğundan, aşağıdakilerden biri gerçekleşinceye kadar tüm işlem blokları

1) Mevcut yürütme, bir G / Ç veya ağ isteği veya harici bir web sitesi isteği gibi harici bir servis talep ediyor

2) Bir fonksiyon çağrısı, daha sonra yapılacak bir zamanlayıcıya konur.

Engelleme / engelleme yapmayan işlevlerin listesi yoktur. Belgeleri kontrol etmelisin.

Birden fazla harici servisin javascript iş parçacığında kilitlemesi varsa ve aynı anda erişmeyi denediğinde, uygulamanız bir yarış koşuluyla karşılaşabilir. Modern tarayıcılar ve V8 motoru bununla ilgileniyor, ancak eğer telefon kullanırsanız ve mobil cihazlar için javascript uygulamaları yazıyorsanız bu yarış koşuluyla karşılaşabilirsiniz. Destek bu yarış koşullarının üstesinden gelmek için orada değil.

Genel olarak, bir geri arama olmadıkça kod bloklarını varsayalım. Ve bir geri arama olsa bile, bunun engellenmeyeceği anlamına gelmez.


-1

Ben de node.js (ve genel olarak JavaScript) konusunda yeniyim ve çok fazla zaman uyumsuz kod kullanmaya alışkın değilim. Ben sadece işaret etmek istedim Sigara Engelleme vs Engelleme genel bakış üzerine nodejs.org o belirtmektedir:

Node.js standart kütüphanesindeki G / Ç yöntemlerinin tümü, engelleyici olmayan ve geri çağırma işlevlerini kabul eden eşzamansız sürümler sağlar. Bazı yöntemlerde, Sync ile biten adları olan engelleyici meslektaşları da vardır.


1
Bu, sorulan soruyu nasıl ele alıyor? Bkz Cevap Nasıl
tatarcık
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.