Jika ada I/O tak segerak, mesti ada pengaturcaraan tak segerak! Mari belajar pengaturcaraan tak segerak dalam Node.js hari ini!
Bekas model single-threaded berada di bawah pengaruh I/O segerak kerana I perlahan /O memanggil , menyebabkan CPU dan I/O tidak dapat bertindih pada tahap aplikasi. Untuk menjaga tabiat membaca dan berfikir pengaturcara, I/O segerak telah popular selama bertahun-tahun. [Pembelajaran yang disyorkan: "tutorial nodejs"]
Tetapi terdapat masalah prestasi yang besar!
Node menggunakan JavaScript dan pustaka tak segerak dalamannya untuk terus meningkatkan tak segerak ke peringkat perniagaan. Ciri terbesar yang dibawa oleh Node ialah model I/O tidak menyekat dipacu peristiwa. I/O tanpa sekatan boleh menghalang CPU dan I/O daripada menunggu antara satu sama lain, membolehkan sumber digunakan dengan lebih baik.
Tujuan: Baca kandungan fail yang sepadan dengan medan utama dalam package.json
Panggil Balik
Menggunakan fungsi panggil balik untuk operasi I/O tak segerak
const fs = require("fs"); fs.readFile("./package.json", { encoding: "utf-8" }, (err, data) => { if (err) throw err; const { main } = JSON.parse(data); fs.readFile(main, { encoding: "utf-8" }, (err, data) => { if (err) throw err; console.log(data); }); });
Soalan: Bagaimana untuk menyelesaikan neraka panggilan balik?
Janji
Promise ialah mesin keadaan terhingga dengan empat keadaan, tiga daripadanya Menunggu dan Ditepati. Selesai), Ditolak (ditolak), dan terdapat juga status yang belum dimulakan
Untuk butiran, anda boleh lihat catatan blog saya sebelum ini Penerokaan awal Janji
Gunakan Promise untuk membaca kandungan fail yang sepadan dengan medan utama dalam package.json
const { readFile } = require("fs/promises"); readFile("./package.json", { encoding: "utf-8" }) .then((res) => { return JSON.parse(res); }) .then((data) => { return readFile(data.main, { encoding: "utf-8" }); }) .then((res) => { console.log(res); });
Membandingkan penyelesaian sebelumnya menggunakan Panggilan Balik, dapat dilihat bahawa tiada panggilan balik bersarang. Melalui satu siri panggilan gaya rantai untuk mengendalikan operasi tak segerak.
Panggil Balik ke Janji
Bagaimana hendak menukar Panggilan Balik kepada borang Janji?
Anda boleh menggunakan fungsi alat Node sendiri util.promisify
untuk melaksanakannya sendiri:
function promisify(fn, receiver) { return (...args) => { return new Promise((resolve, reject) => { fn.apply(receiver, [ ...args, (err, res) => { return err ? reject(err) : resolve(res); }, ]); }); }; } const readFilePromise = promisify(fs.readFile, fs);
tunggu
fungsi tunggu menggunakan try catch untuk menangkap pengecualian (perhatikan pemprosesan selari)
const { readFile } = require("fs/promises"); const start = async () => { const { main } = JSON.parse( await readFile("./package.json", { encoding: "utf-8" }) ); const data = await readFile(main, { encoding: "utf-8" }); console.log(data); }; start();
Sintaks tunggu ditulis seperti pengaturcaraan segerak Operasi di sini ialah bersiri Operasi akan menunggu pelaksanaan baris demi baris.
Sekiranya beberapa tugasan boleh disejajarkan, tidak baik menulis dengan cara ini. Ini adalah, kita boleh menggunakan Promise.all untuk mengendalikan tugasan selari
Ada juga soalan kecil di sini saya bertanya kepada guru selepas kelas, dan ini adalah jawapan guru
[Q] Berkenaan pemprosesan tak segerak, apabila ia berkaitan dengan siri dan selari, saya mempunyai soalan mengenai pemprosesan selari. Jika senario selari memerlukan setiap tugas tak segerak mesti dilaksanakan tanpa mengira kejayaan atau kegagalan tugas lain, dan akhirnya mengendalikan ralat secara seragam, maka apabila menggunakan Promise.all untuk memproses berbilang tugas tak segerak, ralat pelaksanaan tugas pertama akan ditemui dipulangkan. Bagaimanakah kami boleh menyelesaikan semua tugas dan menangani ralat secara seragam? Jika permintaan gagal, ralat akan ditolak serta-merta, jadi kami tidak boleh menggunakan Promise.all untuk melaksanakan perkara ini. Promise mempunyai kaedah allSettled,
developer.mozilla.org/en-US/docs/…Acara Mod terbitkan dan langgan, modul acara terbina dalam Node.js
seperti HTTP
pemantauan acaraserver on('request')
const EventEmitter = require("events"); class MyEmitter extends EventEmitter {} const myEmitter = new MyEmitter(); myEmitter.on("event", () => { console.log("an event occurred!"); }); myEmitter.emit("event"); const http = require("http"); const server = http.createServer((req, res) => { res.end("hello!!! this is YK!!!"); }); server.on("request", (req, res) => { console.log(req.url); }); server.listen(3000);
Alamat asal: https://juejin.cn/post/7005509871000895524
Pengarang: YK bacteria
Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Video Pengaturcaraan! !
Atas ialah kandungan terperinci Ketahui lebih lanjut tentang pengaturcaraan tak segerak dalam Node.js dan kongsi empat penyelesaian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!