Node.js ialah bahasa pengaturcaraan sebelah pelayan berdasarkan model I/O yang dipacu peristiwa dan tidak menyekat, yang menyokong mekanisme panggil balik tak segerak. Apabila melakukan operasi tak segerak dalam Node.js, kami biasanya menggunakan fungsi panggil balik. Panggilan balik bersarang ialah cara khas untuk memanggil fungsi panggil balik.
Panggil balik bersarang boleh menyusun fungsi panggil balik yang lain di dalam fungsi panggil balik. Struktur bersarang ini kelihatan sangat rumit, tetapi ia sebenarnya sering digunakan dalam Node.js, terutamanya apabila berurusan dengan berbilang operasi tak segerak.
Berikut ialah contoh mudah yang menunjukkan cara melakukan panggilan balik bersarang:
// 读取文件1 fs.readFile('file1.txt', function (err, content1) { if (err) throw err; // 读取文件2 fs.readFile('file2.txt', function (err, content2) { if (err) throw err; // 执行一些操作 console.log('文件1的内容是:' + content1); console.log('文件2的内容是:' + content2); }); });
Dalam contoh di atas, kami mula-mula membaca fail file1.txt dan apabila bacaan selesai Selepas itu , fungsi panggil balik akan dilaksanakan. Satu lagi fail fail2.txt dibaca dalam fungsi panggil balik Apabila bacaan selesai, fungsi panggil balik bersarang akan dilaksanakan dan kandungan kedua-dua fail akan dikeluarkan.
Untuk struktur fungsi panggil balik bersarang di atas, jika anda terus meningkatkan sarang, kod akan berkembang dari arah mendatar, seperti berikut:
fs.readFile('file1.txt', function (err, content1) { if (err) throw err; fs.readFile('file2.txt', function (err, content2) { if (err) throw err; fs.readFile('file3.txt', function (err, content3) { if (err) throw err; // 更多嵌套回调函数 }); }); });
Kod sedemikian sukar difahami dan mengekalkan, dan Logiknya mudah dikelirukan dan boleh membawa kepada neraka panggilan balik dengan mudah. Untuk mengelakkan masalah ini, kami boleh menggunakan Promise, async/wait dan kaedah lain untuk pengoptimuman.
Kod yang dioptimumkan menggunakan Promise adalah seperti berikut:
new Promise((resolve, reject) => { fs.readFile('file1.txt', (err, content) => { if (err) reject(err); else resolve(content); }); }) .then(content => { return new Promise((resolve, reject) => { fs.readFile('file2.txt', (err, content) => { if (err) reject(err); else resolve(content); }); }); }) .then(content => { console.log(content); }) .catch(err => { console.error(err); });
Kod yang dioptimumkan menggunakan async/wait adalah seperti berikut:
async function readFile() { try { const content1 = await promisify(fs.readFile)('file1.txt'); const content2 = await promisify(fs.readFile)('file2.txt'); console.log(content1); console.log(content2); } catch (err) { console.error(err); } }
Ia boleh dilihat bahawa menggunakan Janji atau async/ Selepas menunggu pengoptimuman, kod kelihatan lebih jelas dan lebih mudah dibaca, tanpa bersarang terlalu dalam atau neraka panggil balik.
Untuk meringkaskan, walaupun fungsi panggil balik bersarang kelihatan rumit, ia adalah mekanisme panggil balik tak segerak biasa dalam Node.js. Kami boleh mengoptimumkan panggilan balik bersarang dengan menggunakan Promise atau async/wait untuk menjadikan kod lebih ringkas dan mudah difahami.
Atas ialah kandungan terperinci Cara membuat panggilan balik bersarang dalam nodejs. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!