Lebih
Mendapatkan data dari fs.readFile
var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
Log undefined
, mengapa?
275
15
Untuk menguraikan apa yang @Raynos mengatakan, fungsi yang telah didefinisikan adalah asynchronous callback. Itu doesn't mengeksekusi langsung, melainkan mengeksekusi ketika loading file telah selesai. Ketika anda menelepon readFile, kontrol kembali segera dan baris berikutnya kode dijalankan. Jadi, ketika anda menelepon konsol.log, anda callback belum dipanggil, dan konten ini belum ditetapkan. Selamat datang di pemrograman asynchronous.
Contoh pendekatan
Atau lebih baik lagi, sebagai Raynos contoh menunjukkan, bungkus memanggil fungsi dan lulus pada anda sendiri callback. (Rupanya ini adalah praktek yang lebih baik) saya pikir anda mendapatkan ke dalam kebiasaan membungkus async panggilan fungsi yang membutuhkan callback akan menghemat banyak masalah dan kode berantakan.
Sebenarnya ada fungsi Sinkron ini:
http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding
Asynchronous
fs.readFile(filename, [encoding], [panggil ulang])
Asynchronously membaca seluruh isi file. Contoh:
The callback adalah melewati dua argumen (err, data), di mana data adalah isi dari file.
Bila pengkodean tidak ditentukan, maka baku penyangga dikembalikan.
SINKRON
fs.readFileSync(filename, [encoding])
Synchronous versi fs.readFile. Kembali isi dari file bernama filename.
Bila pengkodean ditentukan maka fungsi ini akan mengembalikan sebuah string. Jika tidak maka kembali penyangga.
Menggunakan janji-Janji dengan ES7
Asynchronous dengan menggunakan mz/fs
The
mz
modul menyediakan promisified versi core node perpustakaan. Menggunakan mereka adalah sederhana. Pertama menginstal perpustakaan...Kemudian...
Atau anda dapat menulis mereka dalam asynchronous fungsi:
gunakan ini untuk memanggil file serentak, tanpa encoding untuk menampilkan output sebagai penyangga.
Baris ini akan bekerja,
Seperti dikatakan,
fs.readFile
adalah asynchronous tindakan. Itu berarti bahwa ketika anda memberitahu node untuk membaca sebuah file, anda perlu mempertimbangkan bahwa itu akan mengambil beberapa waktu, dan sementara itu, node terus menjalankan kode berikut. Dalam kasus anda's:konsol.log(konten);
.It's seperti mengirim beberapa bagian dari kode anda untuk perjalanan panjang (seperti membaca sebuah file besar).
Lihatlah komentar-komentar yang saya've tertulis:
Yang's mengapa
konten
yang masih kosong ketika anda log itu. node belum diambil file's konten.Ini bisa diselesaikan dengan memindahkan
konsol.log(konten)
di dalam fungsi callback, tepat setelahcontent = data;
. Dengan cara ini anda akan melihat log ketika node selesai membaca file tersebut dan setelahkonten
mendapat nilai.sinkron dan asinkron membaca file dengan cara:
Node Cheat yang Tersedia di read_file.
Menggunakan dibangun di promisify perpustakaan (Node 8+) untuk membuat tua ini fungsi callback yang lebih elegan.
Ini adalah hanya karena node adalah asynchronous dan itu tidak akan menunggu untuk membaca fungsi dan segera setelah program dijalankan maka akan konsol nilai yang tidak terdefinisi, Yang benar-benar benar karena tidak ada nilai yang diberikan untuk isi variabel. Untuk mengatasinya kita dapat menggunakan janji-janji, generator dll. Kita dapat menggunakan berjanji dengan cara ini.
Untuk menempatkan itu kira-kira, kau're berhadapan dengan node.js yang asinkron di alam.
Ketika kita berbicara tentang async, we're berbicara tentang melakukan atau pengolahan informasi atau data saat berhadapan dengan sesuatu yang lain. Hal ini tidak identik dengan paralel, mohon diingatkan.
Kode anda:
Dengan sampel anda, pada dasarnya tidak konsol.log bagian pertama, dengan demikian variabel 'isi' menjadi tidak terdefinisi.
Jika anda benar-benar ingin output, melakukan sesuatu seperti ini bukan:
Ini adalah asinkron. Ini akan sulit untuk mendapatkan digunakan untuk tetapi, itu adalah apa itu. Sekali lagi, ini adalah kasar tapi cepat penjelasan dari apa yang async.
anda dapat membaca file dengan
Menambahkan pada anda dapat menulis ke file,
dan bahkan rantai bersama-sama
Berikut adalah fungsi akan bekerja untuk
async
bungkus atau janjikemudian
rantaiconst readFileAsync = async (path) => fs.readFileSync(path, 'utf8');