Summary
This chapter added some great new weapons to our tool belt, and as we can see, our journey is getting more focused on specific problems and we have started to delve deeply into more advanced solutions. Often, we reused some of the patterns we have analyzed in the previous chapters: State, Command, and Proxy to provide an effective abstraction for asynchronously initialized modules, asynchronous control flow patterns to add batching and caching to our APIs, deferred execution and events to help us run CPU-bound tasks.
This chapter gave us not only a set of recipes to reuse and customize for our needs, but also some great demonstrations of how mastering a few principles and patterns can help us tackle the most complex problems in Node.js development.
The next two chapters represent the peak of our journey. After studying the various tactics, we are now ready to move to the strategies, and explore the patterns for scaling and distributing our Node.js applications.