Home  >  Article  >  Web Front-end  >  3 ways to implement synchronization operations in node.js_node.js

3 ways to implement synchronization operations in node.js_node.js

WBOY
WBOYOriginal
2016-05-16 16:29:011467browse

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:

Copy code The code 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 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:

Copy code The code 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:

Copy code The code is as follows:

in func3
in func2
in func1

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

Copy code The code 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 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

Copy code The code 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 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:

Copy code The code 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:
Copy code The code 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); 
}
]
);

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn