Generator.prototype.return()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
제너레이터의 return()
메서드는 현재 중단된 위치에서 제너레이터 본체에 리턴 문이 삽입 된 것처럼 작동합니다. 이는 try...finally
블록을 사용하여 제너레이터를 정리 할 수 있도록 합니다.
구문
generatorObject.return(value);
매개변수
value
-
반환할 값입니다.
반환 값
두 개의 속성을 가진 객체
이고, 이 속성은 다음과 같습니다.
done
-
불리언 값입니다.
- 제너레이터 함수의 제어 흐름이 끝에 도달한 경우
true
입니다. - 제너레이터 함수의 제어 흐름이 끝에 도달하지 않고 더 많은 값을 생성할 수 있는 경우
false
입니다. 이는return
이try...finally
에서 실행되었고finally
블록에는 더 많은yield
식이 있을때만 발생할 수 있습니다.
- 제너레이터 함수의 제어 흐름이 끝에 도달한 경우
value
-
인수로 지정된 값이며, 만약
yield
식이try...finally
로 감싸진 경우, 이 값은finally
블록에서 yield 되거나 반환된 값입니다.
설명
return()
메서드는 현재 중단된 위치의 제너레이터 본체에 삽입된 return value;
처럼 보일 수 있습니다. 여기서 value
는 return()
메서드에 전달된 값입니다. 따라서 일반적인 흐름에서 return(value)
를 호출하면 { done: true, value: value }
가 반환됩니다. 그러나 yield
식이 try...finally
블록으로 감싸진 경우, 제어 흐름은 함수를 종료 하지 않고 finally
블록이 실행되도록 합니다. 이 경우 반환되는 값은 다를 수 있으며 finally
블록 내에 더 많은 yield
식이 있다면 done
도 false
일 수 있습니다.
예제
return() 사용하기
다음 예제에서는 간단한 제너레이터와 return
메서드 사용을 보여줍니다.
function* gen() {
yield 1;
yield 2;
yield 3;
}
const g = gen();
g.next(); // { value: 1, done: false }
g.return("foo"); // { value: "foo", done: true }
g.next(); // { value: undefined, done: true }
제너레이터가 이미 "완료" 상태 일때 return(value)
가 호출되면 제너레이터는 "완료" 상태를 유지합니다.
인수를 지정하지 않으면 반환된 객체의 value
속성은 undefined
가 됩니다. 인수가 제공되면 yield
식이 try...finally
로 감싸지지 않는 한 반환된 객체의 value
속성은 해당 값이 됩니다.
function* gen() {
yield 1;
yield 2;
yield 3;
}
const g = gen();
g.next(); // { value: 1, done: false }
g.next(); // { value: 2, done: false }
g.next(); // { value: 3, done: false }
g.next(); // { value: undefined, done: true }
g.return(); // { value: undefined, done: true }
g.return(1); // { value: 1, done: true }
try...finally와 함께 return() 사용하기
yield
식이 try...finally
블록으로 감싸진 경우에만 return
메소드가 호출되었다는 사실을 제너레이터에게 알릴 수 있습니다.
try...finally
문에서 finally
블록은 항상 실행되기 때문에 try
블록 안 일시 중단된 제너레이터에서 return
메서드가 호출되면 제너레이터의 실행이 finally
블록으로 진행됩니다.
function* gen() {
yield 1;
try {
yield 2;
yield 3;
} finally {
yield "cleanup";
}
}
const g1 = gen();
g1.next(); // { value: 1, done: false }
// try...finally 전에 실행이 일시 중단됩니다.
g1.return("early return"); // { value: 'early return', done: true }
const g2 = gen();
g2.next(); // { value: 1, done: false }
g2.next(); // { value: 2, done: false }
// try...finally 내에서 실행이 일시 중단됩니다.
g2.return("early return"); // { value: 'cleanup', done: false }
// 완료 값은 유지됩니다.
g2.next(); // { value: 'early return', done: true }
// 제너레이터가 완료된 상태입니다.
g2.return("not so early return"); // { value: 'not so early return', done: true }
명세서
Specification |
---|
ECMAScript Language Specification # sec-generator.prototype.return |
브라우저 호환성
BCD tables only load in the browser