>  기사  >  웹 프론트엔드  >  node.js_node.js에서 동기화 작업을 구현하는 3가지 방법

node.js_node.js에서 동기화 작업을 구현하는 3가지 방법

WBOY
WBOY원래의
2016-05-16 16:29:011467검색

우리 모두 알고 있듯이 비동기식은 고유한 기능이자 장점이지만 동시에 프로그램 내에서 동기화가 필요합니다(예를 들어 제어 프로그램의 실행 순서는 func1 -> func2 ->; func3)도 매우 일반적입니다. 이 글은 이 문제에 대한 나의 생각 중 일부를 기록한 것입니다.

실행해야 하는 기능:

코드 복사 코드는 다음과 같습니다.

var func1 = 함수(req,res,callback){
setTimeout(함수(){
console.log('in func1');
​ 콜백(req,res,1);
},13000);
}
var func2 = 함수(req,res,callback){
setTimeout(함수(){
console.log('in func2');
​ 콜백(req,res,2);
},5000);
}

var func3 = 함수(req,res,callback){
setTimeout(함수(){
console.log('in func3');
​ 콜백(req,res,3);
},1000);
}

func1, func2, func3에서 setTimeout 함수가 사용된 것을 볼 수 있으며, 실행 시간은 각각 13초, 5초, 1초이다. nodejs의 비동기적 특성으로 인해 일반적인 함수 호출 방법을 사용하는 경우:

코드 복사 코드는 다음과 같습니다.

var req = null;
var res = null;
var 콜백 = function(){};
func1(req,res,callback);
func2(req,res,callback);
func3(req,res,callback);

출력 콘텐츠:

코드 복사 코드는 다음과 같습니다.

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(){
프로세스.종료(0)
})
})
});

이 방법은 빨리 해결할 수 있지만 노출된 문제도 분명합니다. 첫째, 코드 유지 관리가 좋지 않고, 둘째, 코드의 깊은 중첩이 매우 불편해 보입니다. 이 접근 방식은 바람직하지 않습니다.

해결책 2: 재귀 호출

코드 복사 코드는 다음과 같습니다.

함수 실행Func(funcs,count,sum,req,res){
if(개수 == 합계){
반품
}
그렇지 않으면{
funcs[개수](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. Step의 호출은 비교적 신선합니다.

코드 복사 코드는 다음과 같습니다.

스텝(
함수 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(){};

async.series(
[
함수(콜백){
        func1(req,res,callback);
},
함수(콜백){
        func2(req,res,callback);
},
함수(콜백){
        func3(req,res,callback);
}
]
);

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.