Como todos sabemos, assíncrono é um recurso e vantagem exclusivos, mas, ao mesmo tempo, a necessidade de sincronização nos programas (por exemplo, a ordem de execução do programa de controle é: Func1 -> func2 -> func3) também é muito comum. Este artigo registra alguns dos meus pensamentos sobre esse assunto.
Funções a serem executadas:
A cópia do código é a seguinte:
var func1 = function (req, res, retorno de chamada) {
setTimeout (function () {
console.log ('em func1');
retorno de chamada (req, res, 1);
}, 13000);
}
var func2 = function (req, res, retorno de chamada) {
setTimeout (function () {
console.log ('em func2');
retorno de chamada (req, res, 2);
}, 5000);
}
var func3 = function (req, res, retorno de chamada) {
setTimeout (function () {
console.log ('em func3');
retorno de chamada (req, res, 3);
}, 1000);
}
Pode -se observar que no Func1, Func2 e Func3, o tempo de execução é de 13 segundos, 5 segundos e 1 segundo, respectivamente. Devido à natureza assíncrona dos nodejs, se você usar métodos de chamada de função comum:
A cópia do código é a seguinte:
var req = null;
var res = null;
var de chamada var = function () {};
func1 (req, res, retorno de chamada);
func2 (req, res, retorno de chamada);
func3 (req, res, retorno de chamada);
Conteúdo de saída:
A cópia do código é a seguinte:
em func3
em func2
em func1
O motivo é que o NodeJS é assíncrono, o Func2 não esperará que o Func1 seja executado antes de ser executado, mas será executado imediatamente (e o Func3 também é. Como o Func3 tem o menor tempo de execução, termina primeiro, o Func2 seguido pelo Func1 por último. Mas esse obviamente não é o resultado que queremos. O que fazer?
Solução 1: retorno de chamada
A cópia do código é a seguinte:
// Ninho profundo
var req = null;
var res = null;
func1 (req, res, function () {
func2 (req, res, function () {
func3 (req, res, function () {
process.Exit (0);
})
});
});
Embora esse método possa ser resolvido rapidamente, os problemas expostos também são óbvios. Primeiro, a manutenção do código não está em vigor e, segundo, o ninho profundo do código parece desconfortável. Este método não é aconselhável.
Solução 2: Chamada recursiva
A cópia do código é a seguinte:
função executefunc (funcs, contagem, soma, req, res) {
if (count == sum) {
retornar ;
}
outro{
funcs [count] (req, req, function () {
contagem ++;
executefunc (funcs, contagem, soma, req, res);
});
}
}
// chamada síncrona
var req = null;
var res = null;
var funcs = [func1, func2, func3];
var len = funcs.length;
executefunc (funcs, 0, len, req, res);
Primeiro, várias funções são formadas em uma matriz. Você pode usar as características das funções recursivas para fazer o programa executar em uma determinada ordem.
Solução 3: ligue para a biblioteca de classes
Com o desenvolvimento do NodeJS, há cada vez mais bibliotecas de classes que respondem. Passo e assíncrono são os bons.
1. A chamada para a etapa é relativamente refrescante:
A cópia do código é a seguinte:
Etapa(
função thefunc1 () {
func1 (this);
},
função thefunc2 (finflag) {
console.log (FINALFLAG);
func2 (this);
},
função thefunc3 (finflag) {
console.log (FINALFLAG);
}
);
2. Método da série da Async, neste caso, seu método de chamada:
A cópia do código é a seguinte:
var req = null;
var res = null;
var de chamada var = function () {};
Async.Series (
[[
função (retorno de chamada) {
func1 (req, res, retorno de chamada);
},
função (retorno de chamada) {
func2 (req, res, retorno de chamada);
},
função (retorno de chamada) {
func3 (req, res, retorno de chamada);
}
]
);