When we are writing JavaScript with network or file system I/O, there is a 95% chance that we are doing it asynchronously. However, an asynchronous code may tremendously decrease the determinability at the dimension of time. But we are so lucky that JavaScript is usually single-threaded; this makes it possible for us to write predictable code without mechanisms such as locks most of the time.
The predictable code relies on predictable tools (if you are using any). Consider a helper like this:
type Callback = () => void; let isReady = false; let callbacks: Callback[] = []; setTimeout(() => { callbacks.forEach(callback => callback()); callbacks = undefined; }, 100); export function ready(callback: Callback): void { if (!callbacks) { callback(); } else { callbacks.push(callback); } }
This module exports a ready
function, which...