öncelikle mongodb'de araba, marka, model, fiyat datalarını tutuyorum diyelim.
önce araba markalarına göre gruplayıp bunu bi değişkene atmak istiyorum. Sonra buradaki markalara göre tek tek loop içinde dönerken o markaya ait mongodb'deki tüm kayıtları getirip belli hesaplar yapacağım. sonra da yaptığım tüm hesapları bi değişkene atayıp o değişkeni de mongodb'de başka bir tabloya yazmak istiyorum.
fakat burada işlemleri async yapmak gerekiyor galiba. yoksa bir işlem bitmeden diğerine geçiyor ve doğru dataları elde edemiyorum. araba markalarını gruplayan fonksiyonumu async olarak tanımlıyorum fakat içindeki değeri return etmek istediğimde, fonksiyonu çağırdığımda undefined olarak gelmekte. bu async olayını anlamakta zorluk çekiyorum açıkçası.
umarım anlatabilmişimdir. yardım edebilecek varsa çok makbule geçer
Javascript async await anahtar kelimeleriyle google'da aratırsan onlarca yazı bulabilirsin aslında.
Async olarak tanımlanmış her fonksiyon Promise döndürür. Promise'teki veriyi okumak için ya .then metodunu ya da await ifadesini kullanman gerekiyor. Undefined dönen şey aslında return ettiğin şey değil. Return ettiğin şey bir Promise objesi. Sen muhtemelen data.cars gibi propertysine erişmeye çalıştığın için undefined alıyorsun.
@IncredibleMau +1, sorunun kaynağı o. DB'ye isteği atıyorsun, ama daha cevap gelmeden cevabın bir property'sine ulaşmaya çalışıyorsun, o da hata veriyor. Await ile bekleyebilir ya da .then kullanarak callback'ten sonuca erişebilirsin.
Örneğin:
await const cars = func getCars() { return mongo.get("..query..") }
ya da
const cars = func getCars() { return mongo.get("..query..") }
cars.then(result => {....})
gibi.
Bundan sonra loop'ta gezip bir sürü istek atıyorsan orada da Promise.all() kullanabilirsin. Ama onun yerine yapacağın tüm işlemi tek bir query ile mongo üzerinde halletsen (aggregation diye bak daha iyi.
ayrica bu sadece node.js problemi degil mongodb problemi. mongodb de veri yazdiktan hemen sonra ayni veriyi okumaya kalkarsan undefined donecektir. cunku mongodb bir veri yazildiginda aninda yazilacagi garantisini vermiyor. yazma emrini verdikten bir sure sonra yazma islemi gerceklesiyor ve o arada mongodb cache gibi birkac is yapiyor.
kaynak: blog.meteor.com