var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
Log undefined
, kenapa?
javascript
node.js
karaxuna
sumber
sumber
Jawaban:
Untuk menguraikan apa yang dikatakan @Raynos, fungsi yang telah Anda tetapkan adalah panggilan balik yang tidak sinkron. Itu tidak langsung dieksekusi, melainkan dieksekusi ketika memuat file telah selesai. Ketika Anda memanggil readFile, kontrol segera dikembalikan dan baris kode berikutnya dijalankan. Jadi ketika Anda memanggil console.log, callback Anda belum dipanggil, dan konten ini belum disetel. Selamat datang di pemrograman asinkron.
Contoh pendekatan
Atau lebih baik lagi, seperti ditunjukkan oleh contoh Raynos, bungkus panggilan Anda dalam suatu fungsi dan sampaikan panggilan balik Anda sendiri. (Rupanya ini adalah praktik yang lebih baik) Saya pikir membiasakan diri untuk membungkus panggilan async Anda dalam fungsi yang mengambil panggilan balik akan menghemat banyak masalah dan kode berantakan.
sumber
'utf8'
setelah nama file sebagai parameter tambahan, jika tidak, ia hanya akan mengembalikan buffer. Lihat: stackoverflow.com/questions/9168737/…Sebenarnya ada fungsi Sinkron untuk ini:
http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding
Tidak sinkron
fs.readFile(filename, [encoding], [callback])
Secara sinkron membaca seluruh isi file. Contoh:
Panggilan balik dilewatkan dua argumen (err, data), di mana data adalah isi file.
Jika tidak ada pengkodean yang ditentukan, maka buffer mentah dikembalikan.
SINKRONIS
fs.readFileSync(filename, [encoding])
Versi sinkron dari fs.readFile. Mengembalikan konten file bernama nama file.
Jika pengkodean ditentukan maka fungsi ini mengembalikan sebuah string. Kalau tidak, ia mengembalikan buffer.
sumber
data
.if (Buffer.isBuffer( data){ result = data.toString('utf8'); }
Sekarang kami telah mengubah buffer menjadi teks yang dapat dibaca. Ini bagus untuk membaca file plaintext atau menguji file terhadap tipe format. Saya bisa mencoba / menangkap untuk melihat apakah itu file JSON misalnya; tetapi hanya setelah buffer dikonversi menjadi teks. Lihat di sini untuk informasi lebih lanjut: nodejs.org/api/buffer.htmlAF 42 F1
. Sangat praktis untuk komunikasi klien-server-klien.sumber
function readContent(callback)
,, apakahcallback
kata yang dilindungi undang-undang? Maksud saya, apakah ini cara standar untuk menerapkan panggilan balik untuk fungsi kustom Anda? Saya baru saja mulai belajar simpul.event
atauc
atau nama apa pun yang Anda suka - itu bukan kata yang dilindungi undang-undang dalam Javascript, dan saya akan menganggapnya meluas ke Node.js.readContent(function (err, content)
memberi saya kesalahan sintaks saat menggunakan fungsi sebagai parameter.Menggunakan Janji dengan ES7
Penggunaan asinkron dengan mz / fs
The
mz
modul menyediakan versi promisified perpustakaan inti simpul. Menggunakannya sederhana. Pertama instal perpustakaan ...Kemudian...
Atau Anda dapat menuliskannya dalam fungsi asinkron:
sumber
gunakan ini untuk memanggil file secara sinkron, tanpa menyandiaksikan output yang ditampilkan sebagai buffer.
sumber
Baris ini akan bekerja,
sumber
fs.readFileSync
adalah metode sinkronisasi, jadi tidak perlu diawait
sana. Menunggu berguna dengan janji-janji ( simpuljs.org/api/fs.html#fs_fs_promises_api ), ketika Anda ingin menulis kode async dengan sintaksis yang mirip dengan kode sinkronisasi.sumber
sinkronisasi dan cara membaca file async:
Node Cheat Tersedia di read_file .
sumber
Seperti yang dikatakan,
fs.readFile
adalah tindakan asinkron. Ini berarti bahwa ketika Anda memberi tahu node untuk membaca file, Anda perlu mempertimbangkan bahwa itu akan memakan waktu, dan sementara itu, node terus menjalankan kode berikut. Dalam kasus Anda itu:console.log(content);
.Ini seperti mengirim beberapa bagian dari kode Anda untuk perjalanan panjang (seperti membaca file besar).
Lihatlah komentar yang saya tulis:
Itu sebabnya
content
masih kosong saat Anda login. node belum mengambil konten file.Ini bisa diatasi dengan bergerak
console.log(content)
di dalam fungsi panggilan balik, tepat setelah itucontent = data;
. Dengan cara ini Anda akan melihat log ketika simpul selesai membaca file dan setelahcontent
mendapat nilai.sumber
Gunakan pustaka promisifikasi bawaan (Node 8+) untuk membuat fungsi-fungsi panggilan balik yang lama ini lebih elegan.
sumber
const doStuff = async (filePath) => fs.readFileSync(filePath, 'utf8');
, tidak perlu bungkus utilisasi.sumber
Ini hanya karena simpul tidak sinkron dan tidak akan menunggu fungsi baca dan segera setelah program dimulai akan menghibur nilai sebagai tidak terdefinisi, yang sebenarnya benar karena tidak ada nilai yang ditetapkan ke variabel konten. Untuk mengatasinya kita bisa menggunakan janji, generator, dll. Kita bisa menggunakan janji dengan cara ini.
sumber
Berikut ini adalah fungsi yang akan bekerja untuk rantai
async
bungkus atau janjithen
sumber
Anda dapat membaca file dengan
Menambahkan pada Anda dapat menulis ke file,
dan bahkan rantai itu bersama
sumber
Secara kasar, Anda berurusan dengan node.js yang sifatnya tidak sinkron.
Ketika kita berbicara tentang async, kita berbicara tentang melakukan atau memproses informasi atau data saat berurusan dengan sesuatu yang lain. Itu tidak identik dengan paralel, harap diingatkan.
Kode Anda:
Dengan sampel Anda, itu pada dasarnya melakukan bagian console.log terlebih dahulu, sehingga variabel 'konten' tidak terdefinisi.
Jika Anda benar-benar menginginkan hasilnya, lakukan sesuatu seperti ini sebagai gantinya:
Ini tidak sinkron. Akan sulit untuk membiasakan diri, tetapi ini adalah apa adanya. Sekali lagi, ini adalah penjelasan kasar tapi cepat tentang apa itu async.
sumber