As we all know, asynchronous is a unique feature and advantage, but at the same time, the need for synchronization in the program (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.
Function that needs to be executed:
var func3 = function(req,res,callback){
setTimeout(function(){
console.log('in func3');
callback(req,res,3);
},1000);
}
It can be seen that the setTimeout function is used in func1, func2 and func3, and the execution time is 13 seconds, 5 seconds and 1 second respectively. Due to the asynchronous nature of nodejs, if you use the ordinary function calling method:
Output content:
The reason is that because nodejs is asynchronous, func2 will not wait for func1 to finish executing, but will execute it immediately (the same is true for func3). Since func3 has the shortest running time, it ends first, followed by func2 and func1 last. But this is obviously not the result we want. what to do?
Solution 1: callback
func1(req,res,function(){
func2(req,res,function(){
func3(req,res,function(){
Process.exit(0);
})
});
});
Although this method can be solved quickly, the problems exposed are also obvious. First, the code maintenance is not good, and second, the deep nesting of the code looks very uncomfortable. This approach is not advisable.
Solution 2: Recursive call
//Synchronous call
var req = null;
var res = null;
var funcs = [func1,func2,func3];
var len = funcs.length;
executeFunc(funcs,0,len,req,res);
First combine multiple functions 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 corresponding class libraries. Step and async are good ones.
1. The call of Step is relatively refreshing:
async.series(
[
Function(callback){
func1(req,res,callback);
},
Function(callback){
func2(req,res,callback);
},
Function(callback){
func3(req,res,callback);
}
]
);