// async와 await 기본 형식 코드
const asyncFunction = async() => {...}
const value1 = await asyncFunction();
const value2 = await asyncFunction();
const value3 = await asyncFunction();
// async와 await 기본 형식 코드
// async는 Promise 상자를 반환
// await는 Promise 상자를 연다
//Promise
const greetPromise = () => {
return new Promise((resolve, reject) => {
resolve('hello')
})
}
// Async 형태, 기본적으로 Promise를 리턴한다.
const greetAsync = async() => {
return 'hello'
}
const greet = async () => {
const isSuccess = true;
if(isSuccess){
return 'Hello'
}
else{
throw 'Bye'
}
}
try{
const greetText = await greet();
console.log(greetText); // hello
}catch(e){
console.log(e); // Bye
}
제너레이터란 중간에 원하는 부분에서 멈추었다가 그부분부터 다시 실행할 수 있는 능력을 가진 함수를 의미한다.
//Generator 함수 기본 코드
function* generatorFunc1(){ ... }
const generatorFunc2 = function* () {...}
일반 함수는 함수가 어딘가에서 호출되면 그 함수에 대한 제어권은 호출된 함수 본인에게 넘어간다.
예를들어 친구 B가 친구 A에게 소개팅을 해준다고 가정해보자. 친구 B는 함수 호출자가 되고 친구 A는 일반함수가 된다. 함수 B는 소개팅을 주선해주었지만 소개팅에 어떻게 임할지는 친구A에게 달려있다.
제너레이터는 함수 실행의 제어궈을 함수 호출자에게 양도할 수 있다. 즉 함수 호출자는 함수 실행을 일시 중지시키거나 다시 시작하게 할 수 있다.
예를 들어 친구 B가 친구 A에 소개팅에 개입해서 아바타 소개팅과 같이 되는 것을 의미한다.
일반 함수는 호출되는 순간 매개변수를 통해 함수 외부로부터 값을 전달받고 실행이 된다. 다시 말해 함수가 실행되고 있는 동안에는 함수 외부에서 함수 내부로 값을 전달하여 함수의 상태를 변경할 수 없다는 의미이다.
제너레이터 함수는 함수 호출자와 양방향으로 함수의 상태를 주고받을 수 있다. 다시 말해 제너레이터 함수는 함수 호출자에게 자신의 상태를 전달할 수 있고, 함수 호출자로부터 추가적으로 상태를 전달받을 수 있다는 의미이다.
const maArr = [1, 2, 3]
const iterator = maArr[Symbol.iterator]()
const myArr = [1, 2, 3]
const iterator = myArr[Symbol.iterator]()
const iteratorResultObject = iterator.next()
console.log(iteratorResultObject) // {value : 1, done : false}
function* function1(){
try{
yield "씹는다"
yield "못본척한다."
yield "바쁜척한다"
yield "괜히 친구랑 통화르 더 길게 한다"
yield "답장을 보낸다"
}catch(e){
console.log(e)
}
}
const generator = function1()
const first = generator.next(); // {value : "씹는다", done : false}
const second = generator.next() // {value : "답장을 보낸다", done : false}
yield는 제너레이터 함수를 멈추거나 다시 시작하는데 사용하는 키워드를 의미한다.
next 메서드를 사용하면 yield키워드가 사용된 표현식까지 실행되고 함수가 일시 중단된다.
이때 함수의 제어권이 함수 호출자에게 양되된다. 다시 말해 next ㅔㅁ서드가 반복 호출될 때마다 다음 yield 표현식까지 실행과 중지가 반복되는 것을 의미한다.
제너레이터 함수 특징 중 함수 호출자와 제너레이터 함수가 상태를 보고 새로 전달할 수 있다고 하는 방법으로 next() 메서드를 사용하는 것이다.
next() 메서드는 제너레이터가 아닌 일반 이터레이터에서 호출될 때 parameter가 필요없지만 제너레이터에선 인자를 전달할 수 있다.
function* function2(){
const first = yield - 1000
const second = yield(first + 100)
return first + second
}
const generator = function2();
//next() 3번 호출
let first = generator.next() // {value : -1000, done : false}
let second = generator.next(-50) // {value : 50, done :false}
let third = generator.next(200) // {value : 150, done : true}