co
The ultimate generator based flow-control goodness for nodejs
...By yielding promises (or thunks) inside a generator function, co resumes execution when the asynchronous work completes, eliminating deeply nested callbacks. It supports yielding arrays or objects of promises to run tasks concurrently, and it propagates errors naturally through try/catch, making control flow easier to reason about. The library arrived before async/await existed in Node.js and influenced how developers thought about structuring asynchronous programs. Even in a world with native async functions, co remains a concise illustration of cooperative concurrency and still works where generator syntax is preferred. Its API surface is intentionally tiny: wrap a generator, yield work, and let co drive the promise plumbing behind the scenes.