Comme nous le savons tous, Asynchronous est une fonctionnalité et un avantage uniques, mais en même temps, le besoin de synchronisation dans les programmes (par exemple, l'ordre d'exécution du programme de contrôle est: func1 -> func2 -> func3) est également très courant. Cet article enregistre certaines de mes réflexions sur cette question.
Fonctions à exécuter:
La copie de code est la suivante:
var func1 = fonction (req, res, rappel) {
setTimeout (function () {
Console.log («dans Func1»);
rappel (req, res, 1);
}, 13000);
}
var func2 = fonction (req, res, rappel) {
setTimeout (function () {
Console.log («dans Func2»);
rappel (req, res, 2);
}, 5000);
}
var func3 = fonction (req, res, rappel) {
setTimeout (function () {
Console.log («dans Func3»);
rappel (req, res, 3);
}, 1000);
}
On peut voir que dans Func1, Func2 et Func3, le temps d'exécution est respectivement de 13 secondes, 5 secondes et 1 seconde. En raison de la nature asynchrone des NodeJ, si vous utilisez des méthodes d'appel de fonction ordinaire:
La copie de code est la suivante:
var req = null;
var res = null;
var callback = function () {};
func1 (req, res, rappel);
func2 (req, res, rappel);
func3 (req, res, rappel);
Contenu de sortie:
La copie de code est la suivante:
Dans Func3
dans func2
Dans Func1
La raison en est que NodeJS est asynchrone, Func2 n'attendra pas l'exécution de Func1 avant son exécution, mais s'exécutera immédiatement (tout comme Func3). Parce que Func3 a le temps de fonctionnement le plus court, il se termine d'abord, Func2 et Func1 en dernier. Mais ce n'est évidemment pas le résultat que nous voulons. ce qu'il faut faire?
Solution 1: rappel
La copie de code est la suivante:
// nidification profonde
var req = null;
var res = null;
func1 (req, res, function () {
func2 (req, res, function () {
func3 (req, res, function () {
process.exit (0);
})
});
});
Bien que cette méthode puisse être résolu rapidement, les problèmes exposés sont également évidents. Premièrement, la maintenance du code n'est pas en place, et deuxièmement, la nidification profonde du code semble inconfortable. Cette méthode n'est pas recommandée.
Solution 2: appel récursif
La copie de code est la suivante:
Fonction ExecuteFunc (funcs, count, sum, req, res) {
if (count == sum) {
retour ;
}
autre{
funcs [count] (req, req, function () {
Count ++;
ExecuteFunc (funcs, count, sum, req, res);
});
}
}
// appel synchrone
var req = null;
var res = null;
var funcs = [func1, func2, func3];
var len = funcs.length;
EXECUTEFUNC (FUNCS, 0, LEN, REQ, RES);
Tout d'abord, plusieurs fonctions sont formées en un tableau. Vous pouvez ensuite utiliser les caractéristiques des fonctions récursives pour que le programme s'exécute dans un certain ordre.
Solution 3: Appelez la bibliothèque de classe
Avec le développement de NodeJS, il y a de plus en plus de bibliothèques de classe qui réagissent. Step et Async sont les bons.
1. L'appel à pas est relativement rafraîchissant:
La copie de code est la suivante:
Étape(
fonction thefunc1 () {
func1 (this);
},
fonction thefunc2 (finadflag) {
Console.log (FinishFlag);
func2 (this);
},
fonction thefunc3 (finalflag) {
Console.log (FinishFlag);
}
));
2. Méthode de la série d'Async, dans ce cas, sa méthode d'appel:
La copie de code est la suivante:
var req = null;
var res = null;
var callback = function () {};
Sénéres asynchrones (
[
fonction (rappel) {
func1 (req, res, rappel);
},
fonction (rappel) {
func2 (req, res, rappel);
},
fonction (rappel) {
func3 (req, res, rappel);
}
]]
));