발전기는 JavaScript의 Coroutine (Coroutine) 스타일입니다. 그것은 일시 중지 된 다음 실행 중에 재개 될 수있는 기능을 말합니다. 함수는 함수*와 같은 함수의 별표 기호와 수율 및 수율*과 같은 함수의 일부 특징적인 키워드를 동반합니다.
function* generatorfn () {console.log ( 'look ma i sistended')} var generator = generatorfn () // [1] settimeout (function () {generator.next () // [2]}, 2000)코드에 표시된 [1] 및 [2]는 다음과 같이 설명됩니다.
1. 이것은 일시 정지로 시작하는 발전기입니다. 현재 콘솔 출력이 없습니다.
2. 다음 () 메소드를 호출함으로써 만 발전기를 실행하고 다음 수율 키워드 또는 반환을 겪을 때까지 실행할 수 있습니다. 이제 콘솔 출력이 있습니다.
다른 사례를 살펴 보겠습니다.
function *generator () {console.log ( 'start!'); var i = 0; while (true) {if (i <3) 수율 i ++; }} var gen = generator ();위의 코드는 첫 번째 코드와 유사하지만 발전기 기능에는 추가 수율 키워드가 있습니다. 위의 코드가 호출되면 즉시 실행되지 않지만 대기 상태를 일시 중지하므로 시작 출력이 없습니다. 다음 () 호출까지 실행되지 않습니다.
var ret = gen.next (); // start! console.log (ret); // {value : 0, done : false}위의 RET는 발전기 결과입니다. 두 가지 속성이 있습니다.
■ 값, 발전기 기능의 수율 값,
■ 완료하면 생성기 함수가 반환되는지 여부를 나타내는 플래그입니다.
다음과 같이 코드를 계속하십시오.
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 ().
출력은 다음과 같습니다.
0
2 단계
1
첫 번째 단계
다시 말해, Settimeout에서 시간 초과가 종료 될 때까지 기다리지 않지만 "두 번째 단계"와 직접 계속 진행되며 Settimeout에서 차단되지 않습니다.
다른 코드를 살펴 보겠습니다.
function* channel () {var name = apttion 'hello, 당신의 이름은 무엇입니까?' // [1] return 'well hi hi' + name} var gen = channel () console.log (gen.next (). value) // 안녕하세요, 이름은 무엇입니까? [2] console.log (gen.next ( 'Billy')) // 안녕하세요 빌리 [3]Traversal 동안 * 사용할 수도 있습니다.
function* iter () {for (var i = 0; i <10; i ++) for (val val of iter ()) {console.log (val) // 출력 1? - -? 9}.일반적인 오해
함수 실행을 일시 중지 할 수 있으므로 병렬로 실행해야합니까? 아니요, JavaScript는 단일 스레드이기 때문에 성능 향상을 원한다면 발전기가 접시가 아닙니다.
예를 들어 다음 코드는 Fibonacci 번호를 별도로 실행합니다.
함수 fib (n) {var current = 0, next = 1, swap for (var i = 0; i <n; i ++) {swap = current = next = next = swap+next} return current} furrent} 함수* fibgen (n) {var current = 0, next = 1, swap next = next = swap+}성능 결과는 다음과 같습니다. (높을수록 좋습니다)
결과:
일반 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)도 루프를 위해 A를 사용합니다.무한한 시퀀스
값을 지정하는 것이 게으를 수 있으므로 무한 시퀀스와 유사한 일부 Haskell 트릭을 수행 할 수 있습니다. 여기서 무한 시퀀스의 수를 생성 할 수 있습니다.
function* fibgen () {var current = 0, next = 1, swap while (true) {swap = current = next = next = swap + 다음 수익률 current}}Fibonacci 스트림의 게으른 할당을 살펴보고 5000 이후에 첫 번째 피보나키 번호를 반환하도록 요청하십시오.
for (fibgen ()) {if (num> 5000) break} console.log (num) // 6765 용.비동기 프로세스 제어
발전기를 사용하여 비동기 프로세스 제어, 가장 일반적으로 다양한 약속 라이브러리 패키지를 구현하면 어떻게 작동합니까?
노드 세계에서는 모든 것이 저수준 비동기 기능 인 콜백과 관련이 있습니다. 생성기를 사용하여 통신 채널을 구축하여 동기식 프로그래밍 스타일로 비동기 코드를 작성할 수 있습니다.
run (function* () {console.log ( "시작") var file = heatk readfile ( "./ async.js") // [1] console.log (file.toString ())})참고 1은 Async.js가 결과를 반환하기를 기다리기 전에 프로그램이 계속됨을 의미합니다.
Genify는 다음을 사용하여 발전기를 일반 프로그래밍 환경으로 가져 오는 프레임 워크입니다.
NPM 설치 ancenify 설치에 대한 코드는 다음과 같습니다.
var q = 요구 ( 'q'); var fs = require ( 'fs'); var annify = require ( 'genify'); // 객체를 genify functionvar object = genify ({concatFiles : function * (file1, file2, Outfile) {file1 = yield q.nfcall (fs.readfile, file1); file2 = apttit q.nfcall (fs.Readfile, file2); varive q.nfcall (fs.nfcall); }}); // concatfiles는 생성기의 강력한 기능을 사용하는 생성기 기능입니다. object.concatfiles ( './ somefile1.txt', './somefile2.txt', './concated.txt').then(function (res) {// result}, function (err) {// 오류});Node.js에서 JavaScript 생성기를 사용하는 것에 대한 위의 자세한 설명은 내가 공유하는 모든 내용입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.