Asynchronous IO means the application isn't blocked when your computer is waiting for something. The definition of waiting here is not processing. Waiting for a webserver? Waiting for a network connection? Waiting for a hard drive to respond with data on a platter? All of this is IO.
Normally, you write this in a very simple fashion synchronously:
let file = fs.readFileSync('file');
console.log(`got file ${file}`);
This will block, and nothing will happen until readFileSync
returns with what you asked for. Alternatively, you can do this asynchronously which won't block. This compiles totally differently. Under the hood it may be using interrupts. It may be polling handles with select statements. It typically uses a different binding to a low level library, such as libc. That's all you need to know. That'll get your feet wet. Here is what it looks like to us,
fs.readFile(
'file',
function (file) {console.log(`got file ${file}`)}
);
In this you're providing a "callback". That function will request the file immediately, and when it (the function you called, here fs.readFile
) gets the file back it will call your callback (here that's a function that takes a single argument file.
There are difficulties writing things asynchronously:
- Creates pyramid code if using callbacks.
- Errors can be harder to pinpoint.
- Garbage collection isn't always as clean.
- Performance overhead, and memory overhead.
- Can create hard to debug situations if mixed with synchronous code.
All of that is the art of asynchronous programming..