Tarif ettiğiniz sorun iki katlıdır.
- Yazdığınız program dışarıdan bakıldığında bir bütün olarak asenkron davranmalıdır .
- O gerektiğini değil bir işlev çağrısı potansiyel kontrolünü vazgeçer olsun veya olmasın çağrı yerinde görünür.
Bunu başarmanın birkaç yolu var, ama temelde
- çoklu dişlilere sahip (bir miktar soyutlama seviyesinde)
- Dil seviyesinde çoklu fonksiyon türlerine sahip, hepsine bu denir
foo(4, 7, bar, quux)
.
(1) için birden fazla işlemi birlikte yapmak ve çalıştırmak, birden fazla çekirdek ipliği üretmek ve dil-zamanı düzeyinde iş parçacıklarını çekirdek iş parçacıklarına zamanlayan yeşil iş parçacığı uygulamalarını bir araya getiriyorum. Sorunun perspektifinden bakıldığında, onlar aynı. Bu dünyada hiçbir işlev, ipliğin perspektifinden kontrolü hiç bırakmaz veya kaybetmez . İş parçacığının kendisi bazen denetime sahip değildir ve bazen çalışmamaktadır ancak bu dünyadaki kendi iş parçanızın kontrolünden vazgeçmezsiniz. Bu modele uyan bir sistem yeni dişler açma ya da mevcut dişlilerle birleştirme yeteneğine sahip olabilir ya da olmayabilir. Bu modele uyan bir sistem, Unix'inki gibi bir ipliğin çoğaltılması yeteneğine sahip olabilir veya olmayabilir fork
.
(2) ilginç. Adaleti yerine getirmek için giriş ve eleme formları hakkında konuşmalıyız.
Neden örtüklüğün await
Javascript gibi bir dile geriye dönük olarak uyumlu bir şekilde eklenemediğini göstereceğim. Temel fikir, kullanıcıya verilen sözleri ortaya koyarak ve senkronize ve eşzamansız bağlamlar arasında bir ayrım yapmasıyla Javascript, eşzamanlı ve eşzamansız işlevleri düzgün bir şekilde işlemeyi önleyen bir uygulama detayını sızdırmıştır. Ayrıca await
, bir async işlev gövdesinin dışında söz veremeyeceğiniz gerçeği de var . Bu tasarım seçenekleri, "arayanlar için görünmezliği sağlama" ile uyumsuzdur.
Bir lambda kullanarak senkronize bir fonksiyon tanıtabilir ve fonksiyon çağrısıyla ortadan kaldırabilirsiniz.
Senkron fonksiyonu giriş:
((x) => {return x + x;})
Senkron işlev eleme:
f(4)
((x) => {return x + x;})(4)
Bunu eşzamansız fonksiyon tanıtımı ve ortadan kaldırılmasıyla karşılaştırabilirsiniz.
Asenkron fonksiyon tanıtımı
(async (x) => {return x + x;})
Zaman uyumsuz işlev ortadan kaldırması (not: yalnızca bir async
işlev içinde geçerlidir )
await (async (x) => {return x + x;})(4)
Buradaki temel problem, asenkronize bir fonksiyonun aynı zamanda vaat edilen bir nesneyi üreten senkronize bir fonksiyon olmasıdır .
İşte node.js repl dosyasında eşzamanlı olmayan bir eşzamansız işlev çağırma örneği.
> (async (x) => {return x + x;})(4)
Promise { 8 }
Varsayılan olarak, asenkron ve senkronize işlev çağrıları arasındaki farkın çağrı sitesinde görünmediği ve muhtemelen tanım sitesinde görünmediği, dinamik olarak yazılmış bir dil bile olabilirsiniz.
Böyle bir dili almak ve onu Javascript'e indirmek mümkün, sadece tüm işlevleri etkili bir şekilde eşzamansız yapmak zorundasınız.