우리 모두 알고 있듯이 비동기식은 고유한 기능이자 장점이지만 동시에 프로그램 내에서 동기화가 필요합니다(예를 들어 제어 프로그램의 실행 순서는 func1 -> func2 ->; func3)도 매우 일반적입니다. 이 글은 이 문제에 대한 나의 생각 중 일부를 기록한 것입니다.
실행해야 하는 기능:
var func3 = 함수(req,res,callback){
setTimeout(함수(){
console.log('in func3');
콜백(req,res,3);
},1000);
}
func1, func2, func3에서 setTimeout 함수가 사용된 것을 볼 수 있으며, 실행 시간은 각각 13초, 5초, 1초이다. nodejs의 비동기적 특성으로 인해 일반적인 함수 호출 방법을 사용하는 경우:
출력 콘텐츠:
이유는 nodejs가 비동기식이기 때문에 func2는 func1의 실행이 완료될 때까지 기다리지 않고 즉시 실행하기 때문입니다(func3의 경우도 마찬가지입니다). func3은 실행 시간이 가장 짧기 때문에 먼저 종료되고 func2와 func1이 마지막으로 종료됩니다. 하지만 이는 분명히 우리가 원하는 결과가 아닙니다. 무엇을 해야 할까요?
해결책 1: 콜백
func1(req,res,function(){
func2(req,res,function(){
func3(req,res,function(){
프로세스.종료(0)
})
})
});
이 방법은 빨리 해결할 수 있지만 노출된 문제도 분명합니다. 첫째, 코드 유지 관리가 좋지 않고, 둘째, 코드의 깊은 중첩이 매우 불편해 보입니다. 이 접근 방식은 바람직하지 않습니다.
해결책 2: 재귀 호출
//동기호출
var req = null;
var res = null;
var funcs = [func1,func2,func3];
var len = funcs.length;
ExecuteFunc(funcs,0,len,req,res);
먼저 여러 함수를 배열로 결합합니다. 그런 다음 재귀 함수의 특성을 사용하여 프로그램이 특정 순서로 실행되도록 할 수 있습니다.
해결책 3: 수업 라이브러리에 전화
nodejs가 발전하면서 해당 클래스 라이브러리가 점점 더 많아지고 있습니다. 단계와 비동기는 좋은 것입니다.
1. Step의 호출은 비교적 신선합니다.
async.series(
[
함수(콜백){
func1(req,res,callback);
},
함수(콜백){
func2(req,res,callback);
},
함수(콜백){
func3(req,res,callback);
}
]
);