Maison  >  Article  >  interface Web  >  3 façons d'implémenter les opérations de synchronisation dans node.js_node.js

3 façons d'implémenter les opérations de synchronisation dans node.js_node.js

WBOY
WBOYoriginal
2016-05-16 16:29:011467parcourir

Comme nous le savons tous, l'asynchrone est une caractéristique et un avantage uniques, mais en même temps, la nécessité d'une synchronisation dans le programme (par exemple, l'ordre d'exécution du programme de contrôle est : func1 -> func2 -> func3) est également très courant. Cet article consigne certaines de mes réflexions sur cette question.

Fonction qui doit être exécutée :

Copier le code Le code est le suivant :

var func1 = fonction(req,res,callback){
setTimeout(function(){
console.log('in func1');
​ rappel(req,res,1);   },13000);
>
var func2 = function(req,res,callback){
setTimeout(function(){
console.log('in func2');
​ rappel(req,res,2);
},5000);
>
var func3 = fonction(req,res,callback){

setTimeout(function(){
console.log('in func3');
​ rappel(req,res,3);   },1000);
>


On peut voir que la fonction setTimeout est utilisée dans func1, func2 et func3, et le temps d'exécution est respectivement de 13 secondes, 5 secondes et 1 seconde. En raison de la nature asynchrone de nodejs, si vous utilisez la méthode d'appel de fonction ordinaire :

var req = nul;
var res = nul;
var rappel = fonction(){};
func1(req,res,callback);
func2(req,res,callback);
func3(req,res,callback);


Contenu de sortie :

en fonction3
dans func2
en fonction1


La raison est que, comme nodejs est asynchrone, func2 n'attendra pas que func1 termine son exécution, mais l'exécutera immédiatement (il en va de même pour func3). Puisque func3 a le temps d'exécution le plus court, il se termine en premier, suivi de func2 et func1 en dernier. Mais ce n’est évidemment pas le résultat que nous souhaitons. ce qu'il faut faire?

Solution 1 : rappel

//Nidification profonde
var req = null;
var res = nul;

func1(req,res,fonction(){ func2(req,res,fonction(){

func3(req,res,fonction(){
Processus.exit(0);
})
});
});


Bien que cette méthode puisse être résolue rapidement, les problèmes exposés sont également évidents. Premièrement, la maintenance du code n'est pas bonne, et deuxièmement, l'imbrication profonde du code semble très inconfortable. Cette approche n'est pas recommandée.

Solution 2 : Appel récursif

fonction exécuterFunc(funcs,count,sum,req,res){
si(compte == somme){
Retour ;
>
autre{
funcs[count](req,req,function(){
Compte ;
​​​executeFunc(funcs,count,sum,req,res);
});
}  
>

//Appel synchrone var req = null;

var res = nul;
var funcs = [func1,func2,func3];
var len = funcs.length;
exécuterFunc(funcs,0,len,req,res);


Combinez d’abord plusieurs fonctions dans un tableau. Vous pouvez ensuite utiliser les caractéristiques des fonctions récursives pour faire exécuter le programme dans un certain ordre.

Solution 3 : Appeler la bibliothèque de la classe

Avec le développement de nodejs, il existe de plus en plus de bibliothèques de classes correspondantes. Step et async sont de bons modèles.

1. L'appel du Step est relativement rafraîchissant :


Étape(
fonction thefunc1(){
func1(this);
},
fonction thefunc2(finishFlag){
console.log(finishFlag);
func2(this);
},
fonction thefunc3(finishFlag){
console.log(finishFlag);
>
);


La méthode série de 2.async, dans ce cas, sa méthode d'appel :
Copier le code Le code est le suivant :

var req = null;
var res = nul;
var rappel = fonction(){};

async.series(
[
Fonction(rappel){
        func1(req,res,callback);
},
Fonction(rappel){
        func2(req,res,callback);
},
Fonction(rappel){
        func3(req,res,callback);   }
]
);

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn