Как мы все знаем, асинхронный -это уникальная особенность и преимущество, но в то же время необходимость синхронизации в программах (например, порядок выполнения программы управления: func1 -> func2 -> func3) также очень распространена. Эта статья записывает некоторые из моих мыслей по этому вопросу.
Функции для выполнения:
Кода -копия выглядит следующим образом:
var func1 = function (req, res, callback) {
settimeout (function () {
console.log ('in func1');
обратный вызов (req, res, 1);
}, 13000);
}
var func2 = function (req, res, обратный вызов) {
settimeout (function () {
console.log ('in func2');
обратный вызов (req, res, 2);
}, 5000);
}
var func3 = function (req, res, обратный вызов) {
settimeout (function () {
console.log ('in func3');
обратный вызов (req, res, 3);
}, 1000);
}
Видно, что в Func1, Func2 и Func3 время исполнения составляет 13 секунд, 5 секунд и 1 секунду соответственно. Из -за асинхронной природы Nodejs, если вы используете методы вызова обычной функции:
Кода -копия выглядит следующим образом:
var req = null;
var res = null;
var callback = function () {};
func1 (req, res, обратный вызов);
func2 (req, res, обратный вызов);
func3 (req, res, обратный вызов);
Выводный контент:
Кода -копия выглядит следующим образом:
в Func3
в Func2
в Func1
Причина в том, что Nodejs является асинхронным, Func2 не будет ждать, пока Func1 будет выполнена до его выполнения, но сразу же будет выполнена (и так же и является Func3). Поскольку Func3 имеет самое короткое время работы, он заканчивается первым, Func2 с последующим Func1 Last. Но это, очевидно, не тот результат, который мы хотим. что делать?
Решение 1: обратный вызов
Кода -копия выглядит следующим образом:
// глубокое гнездование
var req = null;
var res = null;
func1 (req, res, function () {
func2 (req, res, function () {
func3 (req, res, function () {
process.exit (0);
})
});
});
Хотя этот метод может быть решена быстро, выставленные проблемы также очевидны. Во -первых, обслуживание кода не на месте, а во -вторых, глубокое гнездование кода выглядит неудобно. Этот метод не рекомендуется.
Решение 2: рекурсивный вызов
Кода -копия выглядит следующим образом:
функция executefunc (funcs, count, sum, req, res) {
if (count == sum) {
возвращаться ;
}
еще{
funcs [count] (req, req, function () {
count ++;
executefunc (funcs, count, sum, req, res);
});
}
}
// Синхронный вызов
var req = null;
var res = null;
var funcs = [func1, func2, func3];
var len = funcs.length;
executefunc (funcs, 0, len, req, res);
Во -первых, несколько функций образуются в массив. Затем вы можете использовать характеристики рекурсивных функций, чтобы программа выполнялась в определенном порядке.
Решение 3: Позвоните в библиотеку классов
С развитием Nodejs есть все больше и больше классовых библиотек, которые отвечают. Шаг и асинхронность - хорошие.
1. Призыв к шагу относительно освежает:
Кода -копия выглядит следующим образом:
Шаг(
функция thrunc1 () {
func1 (это);
},
Функция thefunc2 (finishflag) {
console.log (finishflag);
func2 (это);
},
Функция thefunc3 (finishflag) {
console.log (finishflag);
}
);
2. Метод серии Async, в данном случае, его метод вызова:
Кода -копия выглядит следующим образом:
var req = null;
var res = null;
var callback = function () {};
Async.series (
[
function (обратный вызов) {
func1 (req, res, обратный вызов);
},
function (обратный вызов) {
func2 (req, res, обратный вызов);
},
function (обратный вызов) {
func3 (req, res, обратный вызов);
}
]
);