Node.js를 Generators & 콜백과 비교

이 튜토리얼에서 우리는 다음에 대해 배울 것입니다 Generator콜백과의 차이점

발전기란 무엇인가요?

Generator꽤 유명해졌지 Node.js를 최근에는 아마도 그들이 할 수 있는 일 때문일 것입니다.

  • Generators는 일시 중단하고 나중에 다시 시작할 수 있는 함수 실행입니다.
  • Generators는 '지연 실행'과 같은 개념을 수행할 때 유용합니다. 이는 기본적으로 실행을 중단하고 원하는 대로 재개함으로써 필요할 때만 값을 가져올 수 있다는 것을 의미합니다.

Generator아래의 2가지 주요 방법이 있습니다.

  1. 수확량 방법 – 함수 내에서 Yield 메소드를 호출하여 Yield 메소드가 호출된 특정 라인에서 함수의 실행을 정지합니다.
  2. 다음 방법 – 이 메소드는 양보 메소드가 있는 함수의 실행을 재개하기 위해 기본 애플리케이션에서 호출됩니다. 함수 실행은 다음 항복 메서드나 메서드가 끝날 때까지 계속됩니다.

발전기를 어떻게 활용할 수 있는지 예를 들어 보겠습니다.

우리의 예제에서는 숫자 2개를 더하는 간단한 Add 함수를 만들겠지만, 생성기를 사용하는 방법을 보여주기 위해 여러 지점에서 메서드 실행을 계속 중단하겠습니다.

Node.js를 Generators

function* Add(x) {
   yield x + 1;
   var y = yield(null);
   y = 6
   return x + y;
}

var gen = Add(5);

gen.next();

gen.next(); 

코드 설명

  1. 첫 번째 단계는 생성기 "함수"를 정의하는 것입니다. 이것은 함수 키워드에 "*"를 추가하여 수행됩니다. 그런 다음 x의 매개변수를 취하는 Add라는 함수를 정의합니다.
  2. yield 키워드는 생성기에만 해당됩니다. 이는 무엇이든 중간에 함수를 일시 중지하는 데 강력한 구성 요소입니다. 따라서 여기서 함수 실행은 next() 함수를 호출할 때까지 중단되며, 이는 Step4에서 수행됩니다. 이 시점에서 x의 값은 6이 되고 함수 실행이 중단됩니다.
  3. 여기서 우리는 먼저 생성기 함수를 호출하고 5의 값을 Add 함수로 보냅니다. 이 값은 Add 함수의 x 매개변수에 대체됩니다.
  4. next() 함수를 호출하면 Add() 함수가 실행을 재개합니다. 다음 문 var y=yield(null)이 실행되면 Add() 함수는 다시 실행을 중지합니다.
  5. 이제 next() 함수를 다시 호출한 후 다음 문이 실행되고 x=5와 y=6의 결합된 값이 추가되어 반환됩니다.

콜백과 생성기

Generators는 콜백 지옥이라는 문제를 해결하는 데 사용됩니다. Node.js 애플리케이션을 개발하는 동안 콜백 함수가 너무 중첩되어 콜백 함수를 사용하기가 너무 복잡해지는 경우가 있습니다.

여기가 제너레이터가 유용한 곳입니다. 이것의 가장 흔한 예 중 하나는 타이머 함수를 만들 때입니다.

콜백보다 생성기가 어떻게 유용한지 아래 예를 통해 살펴보겠습니다.

우리의 예에서는 간단한 시간 지연 함수를 생성할 것입니다. 그런 다음 1000, 2000 및 3000ms의 지연을 통합하여 이 함수를 호출하려고 합니다.

단계 1) 필요한 시간 지연 코드로 콜백 함수를 정의합니다.

콜백과 콜백 Generators

function Timedelay(ptime, callback) {

setTimeout(function() {
  
    callback("Pausing for " + ptime);
    
  }, time);
}

코드 설명

  1. 여기서는 ptime이라는 매개변수를 사용하여 Timedelay라는 함수를 만듭니다. 애플리케이션에 도입하려는 필요한 시간 지연이 발생합니다.
  2. 다음 단계는 메시지를 만드는 것입니다. 이 메시지는 애플리케이션이 지정된 밀리초 동안 일시 중지된다는 것을 사용자에게 표시합니다.

단계 2) 이제 콜백을 통합하는 경우 코드를 살펴보겠습니다. 1000, 2000 및 3000밀리초 값을 기반으로 콜백을 통합한다고 가정하면 아래 코드는 콜백을 사용하여 이를 구현하는 방법을 보여줍니다.

콜백과 콜백 Generators

Timedelay(1000, function(message) {
  
  console.log(msg);
  Timedelay(2000, function(message) {
    
    console.log(msg);
    Timedelay(3000, function(message) {
      
      console.log(msg);
  })
  })
})

코드 설명

  1. 우리는 값이 1000인 콜백으로 Timedelay를 호출합니다.
  2. 다음으로 값이 2000인 Timedelay 함수를 다시 호출하려고 합니다.
  3. 마지막으로 값이 3000인 Timedelay 함수를 다시 호출하려고 합니다.

위 코드에서 함수 호출을 여러 번 시작하려고 하므로 코드가 더 복잡해지는 것을 볼 수 있습니다.

단계 3) 이제 제너레이터를 사용하여 동일한 코드를 구현하는 방법을 살펴보겠습니다. 아래 코드에서 제너레이터를 사용하여 Timedelay 함수를 구현하는 것이 얼마나 간단해졌는지 확인할 수 있습니다.

콜백과 콜백 Generators

function* Messages() {
  console,log(yield(Timedelay(1000, function(){})));
  console,log(yield(Timedelay(2000, function(){})));
  console,log(yield(Timedelay(3000, function(){})));
}

코드 설명

  1. 먼저, Timedelay 함수를 호출하는 데 사용할 생성기 함수를 정의합니다.
  2. 매개변수 값으로 1000을 사용하여 Timedelay 함수와 함께 Yield 함수를 호출합니다.
  3. 그런 다음 매개변수 값으로 2000을 사용하여 Timedelay 함수와 함께 Yield 함수를 호출합니다.
  4. 마지막으로 매개변수 값이 3000인 Timedelay 함수와 함께 Yield 함수를 호출합니다.

요약

Generators는 중첩된 콜백 문제를 완화하고 콜백 지옥이라고 알려진 문제를 제거하는 데도 사용할 수 있습니다. Generators는 함수 처리를 중단하는 데 사용됩니다. 이는 비동기 함수에서 'yield' 메서드를 사용하여 수행됩니다.