Rumah >hujung hadapan web >tutorial js >Bagaimanakah anda mengendalikan pengambilan data tak segerak dalam gelung dan memastikan semua pertanyaan selesai sebelum mengembalikan set data yang padu?
Dalam banyak senario pengaturcaraan, kami menghadapi keperluan untuk melaksanakan berbilang pangkalan data tak segerak pertanyaan dalam gelung untuk mendapatkan semula data. Walau bagaimanapun, adalah sukar untuk mengurus keputusan dan mengembalikannya sebagai set data kohesif tunggal.
Kod yang disediakan dalam soalan cuba melaksanakan berbilang pertanyaan MongoDB dalam satu gelung, di mana matlamatnya adalah untuk mengumpul data yang diambil semula ke dalam tatasusunan tunggal. Walau bagaimanapun, kod tersebut menghadapi isu di mana hasilnya dikembalikan sebagai 'tidak ditentukan' dan bukannya mengandungi data yang dijangkakan. Ini kerana pernyataan 'kembali' dilaksanakan serta-merta tanpa menunggu semua pertanyaan selesai.
Untuk menangani masalah ini, kita perlu mengamalkan prinsip pengaturcaraan tak segerak. Prinsip ini melibatkan bekerja dengan janji dan mengendalikan operasi tak segerak dengan betul untuk memastikan keputusan dikembalikan hanya apabila semua pertanyaan selesai.
Janji mewakili hasil akhirnya daripada operasi tak segerak. Ia adalah objek yang mengandungi dua fungsi panggil balik: 'resolve' dan 'reject'. Apabila operasi selesai dengan jayanya, 'resolve' dipanggil dengan hasilnya, manakala 'reject' dipanggil sekiranya berlaku kegagalan.
Dalam senario kami, setiap pertanyaan pangkalan data harus mengembalikan objek janji. Ini membolehkan kami membuat rangkaian panggilan balik yang akan dilaksanakan secara berurutan selepas setiap pertanyaan selesai.
Mari kita memfaktorkan semula kod untuk menggabungkan prinsip ini :
var getPrayerCount = function(data2) { var id = data2.id; return find({prayerCat:id}) .then(function(prayer) { if (!prayer) data2.prayersCount = 0; else data2.prayersCount = prayer.length; return data2; }); } var getPrayerInCat = function(data) { var promises = data.map(getPrayerCount); return Q.all(promises); }
Dalam 'getPrayerCount', kami menggunakan 'find' dan bukannya 'Prayer.find' kerana yang pertama mengembalikan janji. Kami kemudian merangkaikan panggilan balik '.then' yang akan memproses hasil setiap pertanyaan.
Dalam 'getPrayerInCat', kami menggunakan 'Q.all' untuk mencipta satu janji yang mewakili pelengkapan semua pertanyaan individu . Ini memastikan bahawa kod akan menunggu semua pertanyaan selesai sebelum mengembalikan hasilnya.
Dengan mengikut prinsip ini, kami boleh mengendalikan pengambilan data tak segerak secara gelung dengan berkesan dan memastikan keputusan dikembalikan sebagai set data padu apabila semua pertanyaan telah selesai.
Atas ialah kandungan terperinci Bagaimanakah anda mengendalikan pengambilan data tak segerak dalam gelung dan memastikan semua pertanyaan selesai sebelum mengembalikan set data yang padu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!