Node.js를 Generators & 콜백과 비교
이 튜토리얼에서 우리는 다음에 대해 배울 것입니다 Generator콜백과의 차이점
발전기란 무엇인가요?
Generator꽤 유명해졌지 Node.js를 최근에는 아마도 그들이 할 수 있는 일 때문일 것입니다.
- Generators는 일시 중단하고 나중에 다시 시작할 수 있는 함수 실행입니다.
- Generators는 '지연 실행'과 같은 개념을 수행할 때 유용합니다. 이는 기본적으로 실행을 중단하고 원하는 대로 재개함으로써 필요할 때만 값을 가져올 수 있다는 것을 의미합니다.
Generator아래의 2가지 주요 방법이 있습니다.
- 수확량 방법 – 함수 내에서 Yield 메소드를 호출하여 Yield 메소드가 호출된 특정 라인에서 함수의 실행을 정지합니다.
- 다음 방법 – 이 메소드는 양보 메소드가 있는 함수의 실행을 재개하기 위해 기본 애플리케이션에서 호출됩니다. 함수 실행은 다음 항복 메서드나 메서드가 끝날 때까지 계속됩니다.
발전기를 어떻게 활용할 수 있는지 예를 들어 보겠습니다.
우리의 예제에서는 숫자 2개를 더하는 간단한 Add 함수를 만들겠지만, 생성기를 사용하는 방법을 보여주기 위해 여러 지점에서 메서드 실행을 계속 중단하겠습니다.
function* Add(x) { yield x + 1; var y = yield(null); y = 6 return x + y; } var gen = Add(5); gen.next(); gen.next();
코드 설명
- 첫 번째 단계는 생성기 "함수"를 정의하는 것입니다. 이것은 함수 키워드에 "*"를 추가하여 수행됩니다. 그런 다음 x의 매개변수를 취하는 Add라는 함수를 정의합니다.
- yield 키워드는 생성기에만 해당됩니다. 이는 무엇이든 중간에 함수를 일시 중지하는 데 강력한 구성 요소입니다. 따라서 여기서 함수 실행은 next() 함수를 호출할 때까지 중단되며, 이는 Step4에서 수행됩니다. 이 시점에서 x의 값은 6이 되고 함수 실행이 중단됩니다.
- 여기서 우리는 먼저 생성기 함수를 호출하고 5의 값을 Add 함수로 보냅니다. 이 값은 Add 함수의 x 매개변수에 대체됩니다.
- next() 함수를 호출하면 Add() 함수가 실행을 재개합니다. 다음 문 var y=yield(null)이 실행되면 Add() 함수는 다시 실행을 중지합니다.
- 이제 next() 함수를 다시 호출한 후 다음 문이 실행되고 x=5와 y=6의 결합된 값이 추가되어 반환됩니다.
콜백과 생성기
Generators는 콜백 지옥이라는 문제를 해결하는 데 사용됩니다. Node.js 애플리케이션을 개발하는 동안 콜백 함수가 너무 중첩되어 콜백 함수를 사용하기가 너무 복잡해지는 경우가 있습니다.
여기가 제너레이터가 유용한 곳입니다. 이것의 가장 흔한 예 중 하나는 타이머 함수를 만들 때입니다.
콜백보다 생성기가 어떻게 유용한지 아래 예를 통해 살펴보겠습니다.
우리의 예에서는 간단한 시간 지연 함수를 생성할 것입니다. 그런 다음 1000, 2000 및 3000ms의 지연을 통합하여 이 함수를 호출하려고 합니다.
단계 1) 필요한 시간 지연 코드로 콜백 함수를 정의합니다.
function Timedelay(ptime, callback) { setTimeout(function() { callback("Pausing for " + ptime); }, time); }
코드 설명
- 여기서는 ptime이라는 매개변수를 사용하여 Timedelay라는 함수를 만듭니다. 애플리케이션에 도입하려는 필요한 시간 지연이 발생합니다.
- 다음 단계는 메시지를 만드는 것입니다. 이 메시지는 애플리케이션이 지정된 밀리초 동안 일시 중지된다는 것을 사용자에게 표시합니다.
단계 2) 이제 콜백을 통합하는 경우 코드를 살펴보겠습니다. 1000, 2000 및 3000밀리초 값을 기반으로 콜백을 통합한다고 가정하면 아래 코드는 콜백을 사용하여 이를 구현하는 방법을 보여줍니다.
Timedelay(1000, function(message) { console.log(msg); Timedelay(2000, function(message) { console.log(msg); Timedelay(3000, function(message) { console.log(msg); }) }) })
코드 설명
- 우리는 값이 1000인 콜백으로 Timedelay를 호출합니다.
- 다음으로 값이 2000인 Timedelay 함수를 다시 호출하려고 합니다.
- 마지막으로 값이 3000인 Timedelay 함수를 다시 호출하려고 합니다.
위 코드에서 함수 호출을 여러 번 시작하려고 하므로 코드가 더 복잡해지는 것을 볼 수 있습니다.
단계 3) 이제 제너레이터를 사용하여 동일한 코드를 구현하는 방법을 살펴보겠습니다. 아래 코드에서 제너레이터를 사용하여 Timedelay 함수를 구현하는 것이 얼마나 간단해졌는지 확인할 수 있습니다.
function* Messages() { console,log(yield(Timedelay(1000, function(){}))); console,log(yield(Timedelay(2000, function(){}))); console,log(yield(Timedelay(3000, function(){}))); }
코드 설명
- 먼저, Timedelay 함수를 호출하는 데 사용할 생성기 함수를 정의합니다.
- 매개변수 값으로 1000을 사용하여 Timedelay 함수와 함께 Yield 함수를 호출합니다.
- 그런 다음 매개변수 값으로 2000을 사용하여 Timedelay 함수와 함께 Yield 함수를 호출합니다.
- 마지막으로 매개변수 값이 3000인 Timedelay 함수와 함께 Yield 함수를 호출합니다.
요약
Generators는 중첩된 콜백 문제를 완화하고 콜백 지옥이라고 알려진 문제를 제거하는 데도 사용할 수 있습니다. Generators는 함수 처리를 중단하는 데 사용됩니다. 이는 비동기 함수에서 'yield' 메서드를 사용하여 수행됩니다.