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