Node.js에서 Javascript 생성기를 사용하는 방법에 대한 자세한 설명_javascript 팁

WBOY
풀어 주다: 2016-05-16 15:01:54
원래의
1812명이 탐색했습니다.

제너레이터(Generator)는 자바스크립트의 코루틴(줄여서 코루틴: coroutine) 스타일로, 실행 중에 일시 정지했다가 다시 시작할 수 있는 함수를 말합니다. 함수에는 function*, function 등 별표 기호가 있습니다. Yield 및 Yield*와 같은 일부 특징적인 키워드.

function* generatorFn () {

 console.log('look ma I was suspended')

}

var generator = generatorFn() // [1]

setTimeout(function () {

 generator.next() // [2]

}, 2000)
로그인 후 복사

코드에 표시된 [1]과 [2]는 다음과 같습니다.

1. 일시 정지 모드에서 시작된 발전기입니다. 현재 콘솔 출력이 없습니다.

2. next() 메서드를 호출하면 이 생성기가 다음 항복 키워드를 만나거나 반환될 때까지 실행됩니다. 이제 콘솔 출력이 표시됩니다.

다른 사례 보기:

function *generator() {

 console.log('Start!');

 var i = 0;

 while (true) {

  if (i < 3)

   yield i++;

 }

}
var gen = generator();
로그인 후 복사

위 코드는 제너레이터 함수에 Yield 키워드가 추가된 점만 제외하면 첫 번째 코드와 유사합니다. 위 코드가 호출되면 즉시 실행되지 않고 일시 중지되어 대기 상태가 됩니다. 시작 출력이 없습니다. next() 호출 전까지는 실행되지 않습니다.

var ret = gen.next();

// Start!

console.log(ret);

// {value: 0, done: false}
로그인 후 복사

위의 ret은 생성기 결과입니다.

■value, 생성기 함수의 산출값,

■done, 제너레이터 함수의 반환 여부를 나타내는 플래그입니다.

계속 코드는 다음과 같습니다.

console.log(gen.next());

// {value: 1, done: false}

console.log(gen.next());

// {value: 2, done: false}

console.log(gen.next());

// {value: undefined, done: true}
로그인 후 복사

Generator는 동기 프로그래밍에 미스터리가 없으며 특히 비동기 프로그래밍에 적합합니다.

발전기에는 두 가지 특성이 있습니다.

1. 함수에서 벗어나 실행을 계속하기 위해 언제 이 함수로 돌아갈지 외부 코드가 결정하도록 선택할 수 있습니다.
2. 비동기 제어를 수행하는 능력.

아래 비동기 실행 코드를 살펴보세요.

var gen = generator();

console.log(gen.next().value);

setTimeout(function() {

 console.log(gen.next().value);

 console.log('第一步');

}, 1000);

console.log('第二步');
로그인 후 복사

출력은 다음과 같습니다.

0
2단계
1
첫걸음

즉, setTimeout에서 타이머가 끝날 때까지 기다리지 않고 바로 "두 번째 단계"로 진행하여 setTimeout에서 차단되지 않습니다.

다른 코드 보기:

function* channel () {

 var name = yield 'hello, what is your name&#63;' // [1]

 return 'well hi there ' + name

}

var gen = channel()

console.log(gen.next().value) // hello, what is your name&#63; [2]

console.log(gen.next('billy')) // well hi there billy [3]
로그인 후 복사

순회할 때 *:
를 사용할 수도 있습니다.

function* iter () {

 for (var i = 0; i < 10; i++) yield i

}

for (var val of iter()) {

 console.log(val) // outputs 1&#63;—&#63;9

}
로그인 후 복사

일반적인 오해

함수 실행을 일시 중지할 수 있으므로 병렬로 실행하도록 해야 합니까? 아니요, Javascript는 단일 스레드이기 때문에 성능을 향상시키려는 경우 생성기는 차 한잔이 아닙니다.

예를 들어 다음 코드는 피보나치 수열을 각각 실행합니다.

function fib (n) {

 var current = 0, next = 1, swap

 for (var i = 0; i < n; i++) {

  swap = current, current = next

  next = swap + next

 }

 return current

}

 

function* fibGen (n) {

 var current = 0, next = 1, swap

 for (var i = 0; i < n; i++) {

  swap = current, current = next

  next = swap + next

  yield current

 }

}
로그인 후 복사

실적 결과는 다음과 같습니다. (높을수록 좋음)

결과:
일반 1263899
발전기 37541

발전기가 빛난다

생성기는 JavaScript 함수의 복잡성을 단순화할 수 있습니다.

게으른 과제

JS 클로저를 사용하여 지연 할당을 구현할 수 있지만, 일시 중지하고 다시 시작하면 필요할 때 값을 얻을 수 있습니다. 예를 들어 위의 fibGen 함수는 필요할 때 가져올 수 있습니다. 새로운 값:

var fibIter = fibGen(20)

var next = fibIter.next()

console.log(next.value)

setTimeout(function () {

 var next = fibIter.next()

 console.log(next.value)

},2000)

当然还使用for循环:依然是懒赋值

for (var n of fibGen(20) {

 console.log(n)

}
로그인 후 복사

무한 시퀀스

게으른 할당이 가능하기 때문에 무한 시퀀스와 유사한 Haskell 트릭을 수행하는 것이 가능합니다. 여기서는 무한한 수의 시퀀스를 생성할 수 있습니다.

function* fibGen () {

 var current = 0, next = 1, swap

 while (true) {

  swap = current, current = next

  next = swap + next

  yield current

 }

}
로그인 후 복사

피보나치 수 스트림의 지연 할당을 살펴보고 5000 이후 첫 번째 피보나치 수를 반환하도록 요청해 보겠습니다.

for (var num of fibGen()) {

 if (num > 5000) break

}

console.log(num) // 6765
로그인 후 복사

비동기식 프로세스 제어

생성기를 사용하여 비동기 프로세스 제어를 구현합니다. 가장 일반적인 것은 다양한 약속 라이브러리 패키지입니다.

노드 분야에서는 모든 것이 저수준 비동기 함수인 콜백과 관련되어 있습니다. 생성기를 사용하여 통신 채널을 설정하고 동기 프로그래밍 스타일을 사용하여 비동기 코드를 작성할 수 있습니다.

run(function* () {

 console.log("Starting")

 var file = yield readFile("./async.js") // [1]

 console.log(file.toString())

})
로그인 후 복사

주석 1은 프로그램이 계속하기 전에 async.js가 결과를 반환할 때까지 기다릴 것임을 나타냅니다.

Genify는 생성기를 일반 프로그래밍 환경으로 가져오는 프레임워크로 다음과 같이 사용됩니다.

npm install genify를 설치하려면 코드는 다음과 같습니다.

var Q = require('q');

var fs = require('fs');

var genify = require('genify');

 

// wrap your object into genify function

var object = genify({

 concatFiles: function * (file1, file2, outFile) {

  file1 = yield Q.nfcall(fs.readFile, file1);

  file2 = yield Q.nfcall(fs.readFile, file2);

  var concated = file1 + file2;

 

  yield Q.nfcall(fs.writeFile, outFile, concated);

 

  return concated;

 }

});

 

// concatFiles是一个generator函数,它使用generator强大能力。

object.concatFiles('./somefile1.txt', './somefile2.txt', './concated.txt').then(function (res) {

 // do something with result

}, function (err) {

 // do something with error

});
로그인 후 복사

위 Node.js에서 Javascript Generator를 사용하는 방법에 대한 자세한 설명은 모두 편집자가 공유한 내용이므로 참고가 되셨으면 좋겠습니다. Script Home을 지원해 주시길 바랍니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!