ECMAScript Generator

15497 단어
Generator 함수는 비동기식 프로그래밍 솔루션입니다.
그것은 하나의 상태기로서 내용이 여러 가지 상태가 있다.
generator 함수를 실행하면 캐리어 대상을 되돌려줍니다. 서로 다른 상태를 얻을 수 있습니다.
구문:
function* 이름() {
yield 표현식 되돌리기;
}
두 가지 특징이 있습니다.
1funcion 키워드 뒤에 추가됨*
2 내부 yield 사용법
function* helloWorldGenerator() {
  yield 'hello';
  yield 'world';
  return 'ending';
}

var hw = helloWorldGenerator();
호출할 때 함수를 실행하지 않고 내부 상태를 가리키는 바늘 대상을 되돌려줍니다.
hw.next () 는 상태를 훑어보고 되돌아오는 값을 가져옵니다.
대상value는 반환값을 표시하고, done는 반복이 끝났는지 여부를 표시합니다.
물론generator는 매개 변수가 있을 수 있고 함수도 있기 때문에 함수의 모든 특징이 있다.
function*generator () {console.log ('a');//yield를 만나면 실행 후를 멈추고 yield 후의 표현식 값을 값으로 되돌려 yield'a',//다음 next 때 yeild 후의 것을 계속 실행합니다. 다음 yield console.log ('b'),/yield 후의 표현식은 next 포인터가 가리키는 것을 호출할 때만 실행됩니다. yield'b', console.log ('c');//만약 yield가 없으면return까지 실행하고 return 후의value로 사용합니다.//return이 없으면value는undefined return'c';//return은 마지막 상태를 표시합니다}//호출된 함수는 실행되지 않으며 결과//가 아니라 내부 상태의 바늘 대상으로next(XX)를 통해 상태와 전달 값을 이동합니다.//상태는 yield를 통해 설정됩니다. 이것은 정지된 표시입니다.next는 실행을 복구하는 데 사용됩니다.var hw=generator();//next () 출력의 대상value는yeildXX의 값을 표시하고,done는 첫 번째 next를 끝낼지//끝낼지 여부를 표시합니다. 함수 첫 줄부터 첫 번째 yield console까지 실행합니다.log(hw.next()); console.log('-----------------') console.log(hw.next()); console.log('-----------------') console.log(hw.next());
yield:
넥스트 () 를 호출해야만 다음 내부 상태를 훑어볼 수 있습니다.
그래서 사실상 실행을 멈출 수 있는 함수를 제공했다.yield 문장은 정지 표지이다.
캐리어 대상의 next 방법의 운행 논리는 다음과 같다.
(1) yield 문장을 만나면 다음 동작을 잠시 멈추고 yield 뒤에 있는 표현식의 값을 되돌아오는 대상의 value 속성 값으로 합니다.
(2) 다음 호출next 방법은 다음 yield 문장이 나타날 때까지 계속 아래로 실행합니다.
(3) 새로운 yield 문장이 없으면 함수가 끝날 때까지 return 문장을 실행하고 return 문장 뒤에 있는 표현식의 값을 되돌아오는 대상의 value 속성 값으로 한다.
(4) 이 함수에 return 문장이 없으면 반환된 대상의 value 속성 값은 undefined 입니다.다음 표현식은next를 호출할 때만 실행되고 되돌아옵니다.
첫 번째next는 함수 꼭대기부터 첫 번째 yield까지 실행됩니다.
Generator 함수는 yield 문장을 사용하지 않아도 되는데, 이때 단순한 실행 유예 함수가 되었다.

Iterator 인터페이스와의 관계


이전 장에서 말했듯이 임의의 대상Symbol.iterator 방법은 이 대상의 트랙터 생성 함수와 같고, 이 함수를 호출하면 이 대상의 트랙터 대상을 되돌려줍니다.
Generator 함수는 트랙터 생성 함수이기 때문에Generator를 대상의 Symbol.iterator 속성에 값을 부여하여 이 대상에Iterator 인터페이스를 가지게 할 수 있습니다.
var myIterable = {};
myIterable[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};

[...myIterable] // [1, 2, 3]

next 방법의 매개 변수§⇧

yield문 자체가 되돌아오는 값이 없거나 항상 되돌아온다undefined.next 방법은 하나의 매개 변수를 가지고 있을 수 있으며, 이 매개 변수는 이전 yield 문장의 반환값으로 간주된다.
function* f() {
  for(var i=0; true; i++) {
    var reset = yield i;
    if(reset) { i = -1; }
  }
}

var g = f();

g.next() // { value: 0, done: false } g.next() // { value: 1, done: false } g.next(true) // { value: 0, done: false }
next()는 함수에 값을 전달할 수 있습니다.
변수에 yield를 부여할 수 있습니다. 그러면 변수는next가 다음에 호출할 때 전달할 값을 얻을 수 있습니다.

for...of 순환

for...of 순환은Generator 함수를 자동으로 훑어볼 수 있으며, 이 때 next 방법을 호출할 필요가 없습니다.
function *foo() {
  yield 1;
  yield 2;
  yield 3;
  yield 4;
  yield 5;
  return 6;
}

for (let v of foo()) {
  console.log(v);
} // 1 2 3 4 5

앞부분에서 소개한 적이 있는데,for...of
루프, 확장 연산자(...
), 부호 및Array.from
방법 내부에서 호출된 것은 모두 캐리어 인터페이스이다.이것은 Generator 함수를 매개 변수로 되돌릴 수 있다는 것을 의미합니다.
[...numbers()] // [1, 2]
Array.from(numbers()) // [1, 2]

g.return(val)
주어진 값을 되돌려주고 Generator 함수를 끝낼 수 있습니다.
yield * 
//generator에서 다른generator 함수를 호출합니다.//용법yield*Gen()///다른 generator를 만났을 때 실행합니다. 실행이 끝난 후에 원래의generator varr=[1,2,3,4,5,[6,7,8]]에 추가합니다.function* generator(a){ var len=a.length; for(var i=0;iyield는 aax 리셋 내next를 실행할 수 있습니다
//generator는 aax에//를 적용하여 aax 리셋에서next를 호출하여 값을 전달할 수 있습니다.//이렇게 하면 yield 후의 코드를 실행할 수 있습니다.//그리고result는 aax의 결과를 얻을 수 있습니다.처리하다.var request=require('request'); function* main(){ var result=yield request('http://www.baidu.com',function(err,res,body){ it.next(body); }) console.log(result); } var it=main(); it.next();

좋은 웹페이지 즐겨찾기