As we all know, asynchronous is a unique feature and advantage, but at the same time, the need for synchronization in programs (for example, the execution order of the control program is: func1 -> func2 -> func3 ) is also very common. This article records some of my thoughts on this issue.
Functions to be executed:
The code copy is as follows:
var func1 = function(req,res,callback){
setTimeout(function(){
console.log('in func1');
callback(req,res,1);
},13000);
}
var func2 = function(req,res,callback){
setTimeout(function(){
console.log('in func2');
callback(req,res,2);
},5000);
}
var func3 = function(req,res,callback){
setTimeout(function(){
console.log('in func3');
callback(req,res,3);
},1000);
}
It can be seen that in func1, func2 and func3, the execution time is 13 seconds, 5 seconds and 1 second respectively. Due to the asynchronous nature of nodejs, if you use ordinary function call methods:
The code copy is as follows:
var req = null;
var res = null;
var callback = function(){};
func1(req,res,callback);
func2(req,res,callback);
func3(req,res,callback);
Output content:
The code copy is as follows:
in func3
in func2
in func1
The reason is that nodejs is asynchronous, func2 will not wait for func1 to be executed before it is executed, but will execute immediately (and so is func3). Because func3 has the shortest running time, it ends first, func2 and func1 last. But this is obviously not the result we want. what to do?
Solution 1: callback
The code copy is as follows:
//Deep nesting
var req = null;
var res = null;
func1(req,res,function(){
func2(req,res,function(){
func3(req,res,function(){
process.exit(0);
})
});
});
Although this method can be solved quickly, the exposed problems are also obvious. First, the code maintenance is not in place, and second, the deep nesting of the code looks uncomfortable. This method is not advisable.
Solution 2: Recursive call
The code copy is as follows:
function executeFunc(funcs,count,sum,req,res){
if(count == sum){
return ;
}
else{
funcs[count](req,req,function(){
count++;
executeFunc(funcs,count,sum,req,res);
});
}
}
//Synchronous call
var req = null;
var res = null;
var funcs = [func1,func2,func3];
var len = funcs.length;
executeFunc(funcs,0,len,req,res);
First, multiple functions are formed into an array. You can then use the characteristics of recursive functions to make the program execute in a certain order.
Solution 3: Call the class library
With the development of nodejs, there are more and more class libraries that respond. Step and async are the good ones.
1. The call to Step is relatively refreshing:
The code copy is as follows:
Step(
function thefunc1(){
func1(this);
},
function thefunc2(finishFlag){
console.log(finishFlag);
func2(this);
},
function thefunc3(finishFlag){
console.log(finishFlag);
}
);
2. Async's series method, in this case, its calling method:
The code copy is as follows:
var req = null;
var res = null;
var callback = function(){};
async.series(
[
function(callback){
func1(req,res,callback);
},
function(callback){
func2(req,res,callback);
},
function(callback){
func3(req,res,callback);
}
]
);