ES6 기능 - Generators
what
Generators를 프로세스를 중단하고 복구할 수 있는 코드 세그먼트로 생각할 수 있습니다.like this:
function* genFunc() {
// (A)
console.log('First');
yield;
console.log('Second');
}
function*
는 새로운Generators 함수의 키워드입니다.yield
는 자신의 조작을 멈출 수 있는 부호이다.yield
를 통해서도 수신 및 발송할 수 있습니다.genFunc()
를 호출하면 프로세스를 제어하는 데 사용할 수 있는 생성기 대상genObj: const genObj = genFunc();
Generators의 개념
Generators are defined with
function*
. function* foo(x) {
yield x + 1;
var y = yield null;
return x + y;
}
결과:
var gen = foo(5);
gen.next(); // { value: 6, done: false }
gen.next(); // { value: null, done: false }
gen.send(2); // { value: 7, done: true }
이 방법을 온라인 편집기에 붙여서 실행한 후에 인쇄한
y = 2
나는 이해하지 못하고 자료를 찾아서 알게 되었다.·var y = yield; or var yield null;을 사용하여 수신합니다.next(파라미터) 방법의 파라미터, 즉 이 파라미터는 생성기에 전송되어 이전 단계의 비동기 작업의 반환 결과로 함수 내의 변수 y에 의해 수신됩니다.
다른 예:
function* foo(x) {
yield x+1;
var y = yield;
console.log(`y=${y}`);
return x + y ;
}
var gen = foo(5);
console.log(gen.next());
console.log(gen.next());
console.log(gen.next(4));
결과:
Object {
"done": false,
"value": 6
}
Object {
"done": false,
"value": undefined
}
"y=4"
Object {
"done": true,
"value": 9
}
Notes:
yield
is allowed anywhere an expression is. This makes it a powerful construct for pausing a function in the middle of anything, such as foo(yield x, yield y), or loops. -- , 。
Generators 유형
function* genFunc() { ··· }
const genObj = genFunc();
const genFunc = function* () { ··· };
const genObj = genFunc();
const obj = {
* generatorMethod() {
···
}
};
const genObj = obj.generatorMethod();
class MyClass {
* generatorMethod() {
···
}
}
const myInst = new MyClass();
const genObj = myInst.generatorMethod();
특성
function fetchJson(url) {
return fetch(url)
.then(request => request.text())
.then(text => {
return JSON.parse(text);
})
.catch(error => {
console.log(`ERROR: ${error.stack}`);
});
}
위아래는 등가이다
// es6
const fetchJson = co.wrap(function* (url) {
try {
let request = yield fetch(url);
let text = yield request.text();
return JSON.parse(text);
}
catch (error) {
console.log(`ERROR: ${error.stack}`);
}
});
// ECMAScript 2017
async function fetchJson(url) {
try {
let request = await fetch(url);
let text = await request.text();
return JSON.parse(text);
}
catch (error) {
console.log(`ERROR: ${error.stack}`);
}
}
Generator가 맡은 역할.
yield
는 next()
를 통해 하나의 데이터를 되돌릴 수 있기 때문에 순환이나 귀속을 통해 많은 데이터를 생성할 수 있다.yield
는 next()
를 통해 데이터를 되돌릴 수 있다. 그러면 다음 데이터를 받기 전에 잠시 멈추고 이 데이터를 소비한 다음에 다시 복구하여 계속 데이터를 받을 수 있다.어떻게 일해요?
function* genFunc() {
yield 'a';
yield 'b';
}
호출 결과:
> const genObj = genFunc();
> genObj.next()
{ value: 'a', done: false }
> genObj.next()
{ value: 'b', done: false }
> genObj.next() // done: true => end of sequence
{ value: undefined, done: true }
function* genFunc() {
['a', 'b'].forEach(x => yield x); // SyntaxError
}
function* genFunc() {
for (const x of ['a', 'b']) {
yield x; // OK
}
}
참고
뒤에 써주세요.
GitHub는 지난번에 여러분의 힘을 모아 전단면 시험 문제를 만들었습니다. 그 안에 여러분이 면접을 볼 때 겪는 문제와 학습 자료가 있습니다. 관심이 있으면 주목해 보세요.당신도 우리에 가입할 흥미가 있다면 프로젝트에 메시지를 남겨 주세요.프로젝트는gitbook에서도 볼 수 있습니다.
InterviewLibrary-GitHub InterviewLibrary-gitbook
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.