Bir işlevi açığa çıkaran bir kitaplık tuttuğunuzu varsayalım getData
. Kullanıcılarınız gerçek verileri almak için onu çağırır:
var output = getData();
Başlık altında veriler bir dosyaya kaydedilir, böylece getData
yerleşik Node.js kullanarak uygulayabilirsiniz fs.readFileSync
. Her ikisi de açıktır getData
ve fs.readFileSync
senkronizasyon işlevleridir. Bir gün, temeldeki veri kaynağını yalnızca eşzamansız olarak erişilebilen MongoDB gibi bir depoya geçirmeniz söylendi. Ayrıca kullanıcılarınızı kızdırmaktan kaçınmanız söylendi, getData
API yalnızca bir söz verecek veya bir geri arama parametresi talep edecek şekilde değiştirilemez. Her iki gereksinimi nasıl karşılıyorsunuz?
Geri arama / söz kullanan asenkron işlev, JavasSript ve Node.js'nin DNA'sıdır. Önemsiz olmayan herhangi bir JS uygulamasına muhtemelen bu kodlama stiline nüfuz edilmiştir. Ancak bu uygulama, sözde geri arama piramidine kolayca yol açabilir. Daha da kötüsü, çağrı zincirindeki herhangi bir arayıcıdaki herhangi bir kod zaman uyumsuz işlevin sonucuna bağlıysa, bu kodun da geri arama işlevine sarılması gerekir, bu da arayana bir kodlama stili kısıtlaması getirir. Zaman zaman, devasa global yeniden faktörlemeden kaçınmak için bir eşzamansız işlevi (genellikle bir 3. taraf kitaplığında sağlanır) bir eşitleme işlevine kapsülleme ihtiyacını buluyorum. Bu konuda bir çözüm aramak genellikle Node Fibers ile sonuçlandıveya ondan türetilen npm paketleri. Ancak Fibers karşılaştığım sorunu çözemiyor. Fibers'in yazarının sağladığı örnek bile eksikliği gösterdi:
...
Fiber(function() {
console.log('wait... ' + new Date);
sleep(1000);
console.log('ok... ' + new Date);
}).run();
console.log('back in main');
Gerçek çıktı:
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
back in main
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
Fiber işlevi, eşzamansız işlev uykusunu gerçekten eşzamanlı hale getiriyorsa, çıktı şu şekilde olmalıdır:
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
back in main
JSFiddle'da başka bir basit örnek oluşturdum ve beklenen çıktıyı verecek kod aradım . Yalnızca Node.js'de çalışan bir çözümü kabul edeceğim, böylece JSFiddle'da çalışmamasına rağmen herhangi bir npm paketine ihtiyaç duymakta özgürsünüz.