우리 모두가 알고 있듯이 비동기식은 고유 한 기능이지만 동시에 프로그램에서 동기화의 필요성 (예 : 제어 프로그램의 실행 순서는 다음과 같습니다. func1 -> func2-> func3)도 매우 일반적입니다. 이 기사는이 문제에 대한 나의 생각 중 일부를 기록합니다.
실행할 기능 :
코드 사본은 다음과 같습니다.
var func1 = function (req, res, 콜백) {
settimeout (function () {
Console.log ( 'func1');
콜백 (req, res, 1);
}, 13000);
}
var func2 = function (req, res, 콜백) {
settimeout (function () {
console.log ( 'func2');
콜백 (Req, Res, 2);
}, 5000);
}
var func3 = function (req, res, 콜백) {
settimeout (function () {
console.log ( 'func3');
콜백 (Req, Res, 3);
}, 1000);
}
FUNC1, FUNC2 및 FUNC3에서 실행 시간은 각각 13 초, 5 초 및 1 초임을 알 수 있습니다. NodeJS의 비동기 특성으로 인해 일반 기능 호출 방법을 사용하는 경우 :
코드 사본은 다음과 같습니다.
var req = null;
var res = null;
var 콜백 = function () {};
func1 (req, res, 콜백);
func2 (req, res, 콜백);
func3 (req, res, 콜백);
출력 내용 :
코드 사본은 다음과 같습니다.
func3에서
func2에서
func1에서
그 이유는 nodejs가 비동기식이기 때문에 func2는 실행되기 전에 func1을 실행할 때까지 기다리지 않지만 즉시 실행됩니다 (func3도 마찬가지). FUNC3은 가장 짧은 실행 시간을 가지기 때문에 먼저 종료되고 func2 다음에 func1이 마지막으로 끝납니다. 그러나 이것은 분명히 우리가 원하는 결과가 아닙니다. 무엇을해야합니까?
해결책 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 () {
카운트 ++;
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. 스텝에 대한 호출은 비교적 상쾌합니다.
코드 사본은 다음과 같습니다.
단계(
기능 thefunc1 () {
func1 (this);
},
기능 thefunc2 (finishflag) {
Console.log (finishflag);
func2 (this);
},
기능 thefunc3 (finishflag) {
Console.log (finishflag);
}
);
2. Async의 시리즈 방법,이 경우 호출 방법 :
코드 사본은 다음과 같습니다.
var req = null;
var res = null;
var 콜백 = function () {};
비동기.
[의 뜻
함수 (콜백) {
func1 (req, res, 콜백);
},
함수 (콜백) {
func2 (req, res, 콜백);
},
함수 (콜백) {
func3 (req, res, 콜백);
}
]]
);