var content; fs.readFile('./Index.html', function read(err, data) { if (err) { throw err; } content = data; }); console.log(content);
Logs undefined
, why?
Advertisement
Answer
To elaborate on what @Raynos said, the function you have defined is an asynchronous callback. It doesn’t execute right away, rather it executes when the file loading has completed. When you call readFile, control is returned immediately and the next line of code is executed. So when you call console.log, your callback has not yet been invoked, and this content has not yet been set. Welcome to asynchronous programming.
Example approaches
const fs = require('fs'); // First I want to read the file fs.readFile('./Index.html', function read(err, data) { if (err) { throw err; } const content = data; // Invoke the next step here however you like console.log(content); // Put all of the code here (not the best solution) processFile(content); // Or put the next step in a function and invoke it }); function processFile(content) { console.log(content); }
Or better yet, as Raynos example shows, wrap your call in a function and pass in your own callbacks. (Apparently this is better practice) I think getting into the habit of wrapping your async calls in function that takes a callback will save you a lot of trouble and messy code.
function doSomething (callback) { // any async callback invokes callback with response } doSomething (function doSomethingAfter(err, result) { // process the async result });