1. Peran Node.js,
Arti I/O, (I/O adalah singkatan dari input/output, seperti: Teks jenis keyboard, input, dan teks ditampilkan di layar. Mouse bergerak, mouse dipindahkan, mouse dipindahkan pada layar, input terminal, dan output yang terlihat. Dll.)
The problem that node.js wants to solve, (process input, high concurrency. For example, there may be millions of gamers in online games, and millions of inputs, etc.) (Node.js is suitable for category: Node.js is most suitable when an application needs to send and receive data on the network. This may be a third-party API, networked device, or real-time communication between a browser and a server)
Makna konkurensi, (istilah konkurensi menggambarkan bahwa hal -hal akan terjadi pada saat yang sama dan dapat berinteraksi satu sama lain. Model I/O yang acara node memungkinkan kita untuk menghindari masalah umum yang saling terkait dan konkurensi dalam I/O asinkron multithreaded asinkron multithreadous.
Jaringan Demonstrasi I/O.
Kode JS
var http = membutuhkan ('http'), urls = ['www.baidu.com', 'www.10jqka.com.cn', 'www.duokan.com']; fungsi fetchpage (url) {var start = new date (); http.get ({host: url}, function (res) {console.log ("Dapatkan respons dari:" + url); console.log ("permintaan mengambil:", tanggal baru () - mulai, "ms");}); } untuk (var i = 0; i <urls.length; i ++) {fetchPage (urls [i]); }Bernama Node.js
Kami menjalankan simpul node.js di terminal
Keluaran:
Kami membutuhkan Node.js untuk mengakses tiga URL dan melaporkan respons yang diterima dan waktu yang dibutuhkan.
Kita dapat melihat bahwa waktu output berbeda untuk dua kali. Dipengaruhi oleh berbagai faktor, waktu untuk menyelesaikan permintaan DNS, program server yang sibuk, dll.
Mengapa JavaScript adalah bahasa yang digerakkan oleh acara
JavaScript berputar di sekitar arsitektur acara yang awalnya dikaitkan dengan model objek dokumen (DOM). Pengembang dapat melakukan hal -hal ketika peristiwa terjadi. Acara ini termasuk pengguna yang mengklik elemen, halaman menyelesaikan pemuatan, dll. Menggunakan acara, pengembang dapat menulis pendengar untuk acara yang dipicu ketika peristiwa terjadi.
2. Callback
1. Apa itu panggilan balik
2. Menganalisis panggilan balik
Panggilan balik mengacu pada melewati fungsi sebagai argumen ke fungsi lain dan biasanya dipanggil setelah fungsi pertama selesai.
Contoh: Misalnya, metode hide () di jQuery,
Kode JS
1, $ ("p"). Sembunyikan ('lambat'); 2, $ ("p"). Sembunyikan ('lambat', fungsi () {alert ("paragraf sekarang tersembunyi")});Callback adalah opsional.
1 Tidak diperlukan panggilan balik
2. Ada panggilan balik. Ketika paragraf disembunyikan, itu akan dipanggil, menunjukkan prompt peringatan.
Untuk melihat perbedaan antara kode dengan dan tanpa panggilan balik
Kode JS
$ ("p"). Sembunyikan ('lambat'); alert ("paragraf sekarang tersembunyi"); // 1 $ ("p"). sembunyikan ('lambat', fungsi () {alert ("paragraf sekarang tersembunyi")}); // 21. Tidak ada panggilan balik, dan perintah eksekusi sama. Namun, kita dapat melihat bahwa paragraf P belum sepenuhnya tersembunyi, waspada keluar.
2. Ada panggilan balik, dan eksekusi dilakukan setelah kulit selesai.
Menganalisis callbacks
Kode JS
fungsi haveBreakfast (makanan, minuman, panggilan balik) {console.log ('Memiliki barakfast' + food + ',' + minuman); if (callback && typeof (callback) === "function") {callback (); }} HArbreakfast ('foast', 'coffee', function () {console.log ('Sarapan jadi. Waktu untuk pergi bekerja!');});Keluaran:
Memiliki busa barakfast, sarapan kopi. Saatnya pergi bekerja!
Berikut adalah fungsi yang dibuat dengan tiga parameter, parameter ketiga adalah callback, yang harus berupa fungsi.
Fungsi HABBREAKFAS mencatat apa yang Anda makan ke dalam konsol dan kemudian memanggil fungsi panggilan balik yang diteruskan ke sana sebagai parameter.
Cara menggunakan panggilan balik untuk node.js
Contoh Menggunakan Modul Sistem File untuk Membaca Konten File dari Disk di Node.js
Kode JS
var fs = membutuhkan ('fs'); fs.readfile ('somefile.txt', 'utf8', function (err, data) {if (err) throw err; console.log (data);});Hasilnya adalah: konten di somefile.txt.
1. Modul FS (FileSystem) diminta untuk digunakan dalam skrip
2. Jalur file pada sistem file disediakan sebagai parameter pertama ke metode fs.readfile.
3. Parameter kedua adalah UTF8, yang menunjukkan pengkodean file
4. Berikan fungsi panggilan balik sebagai parameter ketiga ke metode fs.readfile
5. Parameter pertama dari fungsi panggilan balik adalah ERR, yang digunakan untuk menyimpan kesalahan yang dikembalikan saat membaca file.
6. Parameter kedua dari fungsi panggilan balik adalah untuk memukulnya, dan pengguna menyimpan data yang dikembalikan oleh file baca.
7. Setelah file dibaca, panggilan balik akan dipanggil.
8. Jika Err benar, kesalahan akan dilemparkan.
9. Jika err false, maka data dari file dapat digunakan.
10. Dalam hal ini, data akan dicatat pada konsol.
Yang lainnya adalah modul HTTP, modul HTTP memungkinkan pengembang untuk membuat klien dan server HTTP.
Kode JS
var http = membutuhkan ('http'); http.get ({host: 'shapeshed.com'}, function (res) {console.log ("got response:" + res.statuscode);}). on ('error', function (e) {console.log ("get error:" + e.message);});Hasil: Mendapat tanggapan: 200
1. Minta modul http untuk digunakan dalam skrip
2. Berikan dua parameter ke metode http.get ()
3. Parameter pertama adalah objek opsi. Dalam contoh ini, Anda perlu mendapatkan halaman beranda Shapeshed.com
4. Parameter kedua adalah fungsi panggilan balik dengan respons sebagai parameter
5. Ketika server jarak jauh mengembalikan fungsi yang sesuai, fungsi panggilan balik akan dipicu.
6. Catat kode status respons dalam fungsi panggilan balik. Jika ada kesalahan, Anda dapat merekamnya.
Selanjutnya, mari kita lihat bahwa 4 operasi I/O yang berbeda sedang terjadi, mereka semua menggunakan panggilan balik
Kode JS
var fs = membutuhkan ('fs'), http = membutuhkan ('http'); http.get ({host: 'www.baidu.com'}, function (res) {console.log ("baidu.com");}). on ('error', function (e) {console.log ("get error:" + e.message);}); fs.readfile ('somefile.txt', 'utf8', function (err, data) {if (err) throw err; console.log ("somefile");}); http.get ({host: 'www.duokan.com'}, function (res) {console.log ("duokan.com");}). on ('error', function (e) {console.log ("dapatkan kesalahan:" + e.message);}); fs.readfile ('somefile2.txt', 'utf8', function (err, data) {if (err) throw err; console.log ("somefile2");});Bisakah kita tahu operasi mana yang lebih dulu?
Dugaannya adalah bahwa kedua file yang dibaca dari disk dikembalikan terlebih dahulu, karena tidak perlu memasukkan jaringan, tetapi sulit bagi kita untuk mengatakan file mana yang akan kembali terlebih dahulu, karena kita tidak tahu ukuran file. Untuk akuisisi dua halaman rumah, skrip perlu memasuki jaringan, dan waktu respons tergantung pada banyak hal yang tidak dapat diprediksi. Proses Node.js tidak akan keluar sampai ada panggilan balik terdaftar yang belum dipicu. Callbacks pertama -tama menyelesaikan ketidakpastian, dan juga merupakan cara yang efisien untuk menangani konkurensi (atau melakukan lebih dari satu hal pada satu waktu).
Berikut hasil eksekusi saya
Kode sinkron dan asinkron
Pertama lihat kode, sinkronisasi (atau blokir) kode tersebut
Kode JS
function sleep (milidonds) {var start = new date (). getTime (); while ((new date (). getTime () -start) <milionseconds) {}} fechpage () {console.log ('fetching page'); Sleep (2000); console.log ('data dikembalikan dari halaman yang meminta'); } function fetchapi () {console.log ('fetching API'); Sleep (2000); console.log ('data dikembalikan dari API'); } fetchPage (); fetchapi ();Saat skrip berjalan, fungsi fetchPage () akan dipanggil. Sampai kembali, menjalankan skrip diblokir. Sebelum fungsi fetchPage () kembali, program tidak dapat dipindahkan ke fungsi fetchapi (). Ini disebut operasi pemblokiran.
Node.js hampir tidak pernah menggunakan gaya pengkodean ini, tetapi panggilan balik balik secara tidak sinkron.
Lihat kode berikut,
Kode JS
var http = membutuhkan ('http'); fungsi fetchPage () {console.log ('fetching page'); http.get ({host: 'www.baidu.com', path: '/? Delay = 2000'}, function (res) {console.log ('data dikembalikan dari halaman yang meminta');}). on ('error', function (e) {console.log ("Ada kesalahan" + e);}); } function fetchapi () {console.log ('fetching API'); http.get ({host: 'www.baidu.com', path: '/? Delay = 2000'}, function (res) {console.log ('data dikembalikan dari meminta API');}). on ('error', function (e) {console.log ("Ada kesalahan" + e);}); } fetchPage (); fetchapi ();Ketika kode ini diizinkan, Anda tidak lagi menunggu fungsi fetchPage () untuk kembali, dan fungsi fetchapi () akan segera dipanggil. Kode diblokir dengan menggunakan callback. Setelah dipanggil, kedua fungsi mendengarkan pengembalian server jarak jauh dan memicu fungsi callback.
Perhatikan bahwa urutan pengembalian fungsi -fungsi ini tidak dapat dijamin, tetapi terkait dengan jaringan.
Loop acara
Node.js menggunakan loop acara JavaScript untuk mendukung gaya pemrograman asinkron yang dianjurkannya. Pada dasarnya, loop acara memungkinkan sistem untuk menyimpan fungsi callback terlebih dahulu dan kemudian dijalankan ketika acara terjadi di masa depan. Ini dapat berupa data pengembalian database atau data pengembalian permintaan HTTP. Karena pelaksanaan fungsi callback ditunda sampai acara terbalik, tidak perlu menghentikan eksekusi, dan aliran kontrol dapat kembali ke lingkungan runtime simpul, memungkinkan hal -hal lain terjadi.
Node.js sering dianggap sebagai kerangka kerja pemrograman jaringan karena dirancang untuk menangani ketidakpastian dalam aliran data dalam jaringan. Apa yang berkontribusi pada desain semacam itu adalah loop acara dan penggunaan panggilan balik, dan mereka seperti programmer yang dapat menulis kode asinkron yang merespons acara jaringan atau I/O.
Aturan yang harus diikuti adalah: fungsi harus dikembalikan dengan cepat, fungsi tidak boleh diblokir, dan operasi yang sudah berjalan lama harus dipindahkan ke proses lain.
Apa yang tidak cocok untuk node.js termasuk memproses sejumlah besar data atau perhitungan berjalan untuk waktu yang lama. Node.js dirancang untuk mendorong data pada jaringan dan melengkapinya secara instan.