Summary
This chapter added some great new weapons to our tool belt, and as we can notice, 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, and finally a mix of various design patterns to enable our modules to run seamlessly in both Node.js and the browser.
This chapter gave us not only a set of recipes to reuse and customize for our needs, but also some great demonstrations of how the mastering of 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...