Como todos sabemos, Asynchronous es una característica y ventaja únicas, pero al mismo tiempo, la necesidad de sincronización en los programas (por ejemplo, el orden de ejecución del programa de control es: func1 -> func2 -> func3) también es muy común. Este artículo registra algunos de mis pensamientos sobre este tema.
Funciones para ser ejecutadas:
La copia del código es la siguiente:
var func1 = function (req, res, llamado) {
setTimeOut (function () {
console.log ('en func1');
devolución de llamada (req, res, 1);
}, 13000);
}
var func2 = function (req, res, llamado) {
setTimeOut (function () {
console.log ('en func2');
devolución de llamada (req, res, 2);
}, 5000);
}
var func3 = function (req, res, llamado) {
setTimeOut (function () {
console.log ('en func3');
devolución de llamada (req, res, 3);
}, 1000);
}
Se puede ver que en Func1, Func2 y Func3, el tiempo de ejecución es de 13 segundos, 5 segundos y 1 segundo respectivamente. Debido a la naturaleza asincrónica de NodeJS, si usa métodos de llamadas de función ordinaria:
La copia del código es la siguiente:
var req = null;
var res = null;
var llamadaback = function () {};
func1 (req, res, devolución de llamada);
func2 (req, res, devolución de llamada);
Func3 (req, res, devolución de llamada);
Contenido de salida:
La copia del código es la siguiente:
en func3
en func2
en func1
La razón es que NodeJS es asíncrono, Func2 no esperará a que Func1 se ejecute antes de ejecutarlo, pero se ejecutará de inmediato (y así es FUNC3). Debido a que Func3 tiene el tiempo de ejecución más corto, termina primero, Func2 seguido de FUNC1 al final. Pero este obviamente no es el resultado que queremos. ¿Qué hacer?
Solución 1: devolución de llamada
La copia del código es la siguiente:
// anidación profunda
var req = null;
var res = null;
func1 (req, res, function () {
Func2 (req, res, function () {
Func3 (req, res, function () {
proceso.exit (0);
})
});
});
Aunque este método se puede resolver rápidamente, los problemas expuestos también son obvios. Primero, el mantenimiento del código no está en su lugar, y segundo, la anidación profunda del código parece incómoda. Este método no es aconsejable.
Solución 2: llamada recursiva
La copia del código es la siguiente:
function ejecuteFunc (funcs, count, suma, req, res) {
if (count == suma) {
devolver ;
}
demás{
funcs [count] (req, req, function () {
contar ++;
ejecutarfunc (funcs, count, suma, req, res);
});
}
}
// llamada sincrónica
var req = null;
var res = null;
var funcs = [func1, func2, func3];
var len = funcs.length;
ejecutarfunc (funcs, 0, len, req, res);
Primero, se forman múltiples funciones en una matriz. Luego puede usar las características de las funciones recursivas para que el programa se ejecute en un determinado orden.
Solución 3: llame a la biblioteca de clases
Con el desarrollo de NodeJs, hay más y más bibliotecas de clase que responden. Step y Async son los buenos.
1. La llamada al paso es relativamente refrescante:
La copia del código es la siguiente:
Paso(
función theFunc1 () {
func1 (esto);
},
función theFunc2 (finkflag) {
console.log (finkflag);
func2 (esto);
},
función theFunc3 (finkflag) {
console.log (finkflag);
}
);
2. Método de la serie de Async, en este caso, su método de llamada:
La copia del código es la siguiente:
var req = null;
var res = null;
var llamadaback = function () {};
Async.Series (
[
función (devolución de llamada) {
func1 (req, res, devolución de llamada);
},
función (devolución de llamada) {
func2 (req, res, devolución de llamada);
},
función (devolución de llamada) {
Func3 (req, res, devolución de llamada);
}
]
);