Elegant handling method of Nodejs asynchronous callback_node.js
Foreword
The biggest highlight of Nodejs is the event-driven, non-blocking I/O model, which makes Nodejs have strong concurrent processing capabilities and is very suitable for writing network applications. Most I/O operations in Nodejs are almost asynchronous, that is, the results of our I/O operations basically need to be processed in callback functions, such as the following function that reads file content:
fs.readFile('/etc/passwd', function (err, data) {
if (err) throw err;
console.log(data);
});
Then, what should we do if we read two files and merge the contents of the two files together for processing? Most people who have been exposed to js for a short time may do this:
fs.readFile('/etc/passwd', function (err, data) {
if (err) throw err;
fs.readFile('/etc/passwd2', function (err, data2) {
If (err) throw err;
// Process the data of data and data2 here
});
});
If you deal with multiple similar scenarios, wouldn’t it be that the callback functions are nested layer by layer? This is what everyone often calls the callback pyramid or callback hell (http://callbackhell.com/) is also the most troublesome problem for js newbies.
This kind of nested code brings many problems to development, mainly reflected in:
1. Code possibility becomes worse
2. Difficulty in debugging
3. Difficult to troubleshoot when an abnormality occurs
This article mainly introduces how to handle the above asynchronous callback issues gracefully.
Basic solution: Handle asynchronous callbacks recursively
We can use recursion as an execution control tool for our code. Encapsulate the operations that need to be performed into a function, and control the execution process of the code through recursive calls in the callback function. Without further ado, let’s go to the last code:
var fs = require('fs');
// List of files to process
var files = ['file1', 'file2', 'file3'];
function parseFile () {
if (files.length == 0) {
Return;
}
var file = files.shift();
fs.readFile(file, function (err, data) {
// File data is processed here
ParseFile(); // After processing, process the next file through recursive call
});
}
//Start processing
parseFile();
The above code has processed the files in the array sequentially as an example, introducing the recursive method to control the execution flow of the code.
It is good to apply it to some simple scenarios. For example, we can use this method to save the data in an array to the database in sequence.
Some simple asynchronous callback problems can be solved through recursion. However, it is still somewhat incapable of handling complex asynchronous callbacks (such as the need to synchronize the results of multiple asynchronous operations).
Gorgeous point: Use third-party libraries such as Async, Q, and Promise to handle asynchronous callbacks
In order to better handle the problem of nested callbacks, you can consider using some third-party libraries that specialize in asynchronous processing. Of course, if you have the ability, you can write your own auxiliary tool for asynchronous processing.
The more commonly used libraries for handling asynchronous processing are: async, q and promise. Judging from the npmjs.org website, async is the most popular. I have used async before, and it is indeed very convenient. The control flow of various asynchronous processing is also implemented very well.
We will use async to process the initial code that reads two files at the same time. The example is as follows:
var async = require('async')
, fs = require('fs');
async.parallel([
function(callback){
fs.readFile('/etc/passwd', function (err, data) {
If (err) callback(err);
callback(null, data);
});
},
function(callback){
fs.readFile('/etc/passwd2', function (err, data2) {
If (err) callback(err);
callback(null, data2);
});
}
],
function(err, results){
// The data of data and data2 are processed here, and the content of each file is obtained from results
});
Through the async module, the asynchronous execution process can be well controlled, which can also be regarded as solving the problem of callbacks at all levels. The code is clearer than before, but it is still inseparable from the callback function.
Think about it, wouldn’t it be great if you could handle asynchronous processing without using callback functions? Next, let’s talk about using the new features of ES6 to achieve this goal.
Be elegant: embrace ES6, replace callback functions, and solve the callback hell problem
It is said that EcmaScript Harmony (ES6) has introduced many new features to js. Students who don’t know much about ES6 can check it out on Baidu.
To use the new features of ES6 in nodejs, you need to use version v0.11.x or above.
This article introduces the use of Generator features to replace callback functions. Don’t you know about Generator? You can take a look here.
The two modules co and thunkify are used here. You can install them using the npm install command.
Let’s take the problem mentioned at the beginning of this article as an example. The example code for using the generator feature is as follows:
var fs = require('fs')
, co = require('co')
, thunkify = require('thunkify');
var readFile = thunkify(fs.readFile);
co(function *() {
var test1 = yield readFile('test1.txt');
var test2 = yield readFile('test2.txt');
var test = test1.toString() test2.toString();
console.log(test);
})();
Handling exceptions in code is also very simple, just do this:
try {
var test1 = yield readFile('test1.txt');
} catch (e) {
// Handle exceptions here
}
Isn’t this code much more elegant? Isn’t it great to handle asynchronous code just like writing synchronous code?
For web development in the field of nodejs, the most popular framework is express. It is worth mentioning that TJ, a core member of express, has led a new web framework-koa, which is claimed to be the next generation web development framework. , koa really takes advantage of the generator feature of ES6, allowing us to avoid falling into layers of callbacks when developing web systems.
Summary
Quoting a sentence from the fibjs project promotion: Less Callback, More Girls - Less callback, more girls

JavaScript's application in the real world includes front-end and back-end development. 1) Display front-end applications by building a TODO list application, involving DOM operations and event processing. 2) Build RESTfulAPI through Node.js and Express to demonstrate back-end applications.

The main uses of JavaScript in web development include client interaction, form verification and asynchronous communication. 1) Dynamic content update and user interaction through DOM operations; 2) Client verification is carried out before the user submits data to improve the user experience; 3) Refreshless communication with the server is achieved through AJAX technology.

Understanding how JavaScript engine works internally is important to developers because it helps write more efficient code and understand performance bottlenecks and optimization strategies. 1) The engine's workflow includes three stages: parsing, compiling and execution; 2) During the execution process, the engine will perform dynamic optimization, such as inline cache and hidden classes; 3) Best practices include avoiding global variables, optimizing loops, using const and lets, and avoiding excessive use of closures.

Python is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.

Python and JavaScript have their own advantages and disadvantages in terms of community, libraries and resources. 1) The Python community is friendly and suitable for beginners, but the front-end development resources are not as rich as JavaScript. 2) Python is powerful in data science and machine learning libraries, while JavaScript is better in front-end development libraries and frameworks. 3) Both have rich learning resources, but Python is suitable for starting with official documents, while JavaScript is better with MDNWebDocs. The choice should be based on project needs and personal interests.

The shift from C/C to JavaScript requires adapting to dynamic typing, garbage collection and asynchronous programming. 1) C/C is a statically typed language that requires manual memory management, while JavaScript is dynamically typed and garbage collection is automatically processed. 2) C/C needs to be compiled into machine code, while JavaScript is an interpreted language. 3) JavaScript introduces concepts such as closures, prototype chains and Promise, which enhances flexibility and asynchronous programming capabilities.

Different JavaScript engines have different effects when parsing and executing JavaScript code, because the implementation principles and optimization strategies of each engine differ. 1. Lexical analysis: convert source code into lexical unit. 2. Grammar analysis: Generate an abstract syntax tree. 3. Optimization and compilation: Generate machine code through the JIT compiler. 4. Execute: Run the machine code. V8 engine optimizes through instant compilation and hidden class, SpiderMonkey uses a type inference system, resulting in different performance performance on the same code.

JavaScript's applications in the real world include server-side programming, mobile application development and Internet of Things control: 1. Server-side programming is realized through Node.js, suitable for high concurrent request processing. 2. Mobile application development is carried out through ReactNative and supports cross-platform deployment. 3. Used for IoT device control through Johnny-Five library, suitable for hardware interaction.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

VSCode Windows 64-bit Download
A free and powerful IDE editor launched by Microsoft

SublimeText3 Linux new version
SublimeText3 Linux latest version

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

Dreamweaver CS6
Visual web development tools