var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
Logy nedefinované
, prečo?
Aby som upresnil to, čo povedal @Raynos, funkcia, ktorú ste definovali, je asynchrónne spätné volanie. Nevykoná sa hneď, ale až po dokončení načítania súboru. Keď zavoláte readFile, riadenie sa okamžite vráti a vykoná sa ďalší riadok kódu. Takže keď voláte console.log, vaše spätné volanie ešte nebolo vyvolané a tento obsah ešte nebol nastavený. Vitajte v asynchrónnom programovaní.
Príklad prístupov
const fs = require('fs');
var content;
// First I want to read the file
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
// Invoke the next step here however you like
console.log(content); // Put all of the code here (not the best solution)
processFile(); // Or put the next step in a function and invoke it
});
function processFile() {
console.log(content);
}
Alebo ešte lepšie, ako ukazuje Raynosov príklad, zabaľte volanie do funkcie a odovzdajte vlastné spätné volania. (Zrejme je to lepší postup.) Myslím, že ak si zvyknete svoje asynchrónne volania zabaliť do funkcie, ktorá prijíma spätné volanie, ušetríte si veľa problémov a neprehľadného kódu.
function doSomething (callback) {
// any async callback invokes callback with response
}
doSomething (function doSomethingAfter(err, result) {
// process the async result
});
V skutočnosti na to existuje funkcia Synchronous:
http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding.
fs.readFile(názov súboru, [kódovanie], [spätné volanie])
Asynchrónne prečíta celý obsah súboru. Príklad:
fs.readFile('/etc/passwd', function (err, data) {
if (err) throw err;
console.log(data);
});
Spätnému volaniu sa odovzdajú dva argumenty (err, data), kde data je obsah súboru._
Ak nie je zadané žiadne kódovanie, potom sa vráti surová vyrovnávacia pamäť.
fs.readFileSync(názov súboru, [kódovanie])
Synchrónna verzia fs.readFile. Vracia obsah súboru s názvom súboru.
Ak je zadané kódovanie, potom táto funkcia vráti reťazec. V opačnom prípade vráti vyrovnávaciu pamäť.
var text = fs.readFileSync('test.md','utf8')
console.log (text)
function readContent(callback) {
fs.readFile("./Index.html", function (err, content) {
if (err) return callback(err)
callback(null, content)
})
}
readContent(function (err, content) {
console.log(content)
})