본문 바로가기

Javascript

콜백함수 제너레이터(Generator)

✅ <비동기 작업의 동기적 표현(3) - Generator>

이터러블 객체(Iterable): 반복할 수 있는 객체

제너레이터 문법이 등장해요.

*가 붙은 함수가 제너레이터 함수입니다. 제너레이터 함수는 실행하면, Iterator 객체가 반환(next()를 가지고 있음)

 

iterator 은 객체는 next 메서드로 순환 할 수 있는 객체. next 메서드 호출 시, Generator 함수 내부에서 가장 먼저 등장하는 **yield**에서 stop 이후 다시 next 메서드를 호출하면 멈췄던 부분 -> 그 다음의 **yield(:멈춤: 양보하다, 미루다)**까지 실행 후 stop

 

즉, 비동기 작업이 완료되는 시점마다 next 메서드를 호출해주면 Generator 함수 내부소스가 위 -> 아래 순차적으로 진행돼요 😊

var addCoffee = function (prevName, name) {
	setTimeout(function () {
		coffeeMaker.next(prevName ? prevName + ', ' + name : name);
	}, 500);
};
var coffeeGenerator = function* () {
	var espresso = yield addCoffee('', '에스프레소');
	console.log(espresso);
	var americano = yield addCoffee(espresso, '아메리카노');
	console.log(americano);
	var mocha = yield addCoffee(americano, '카페모카');
	console.log(mocha);
	var latte = yield addCoffee(mocha, '카페라떼');
	console.log(latte);
};
var coffeeMaker = coffeeGenerator();
coffeeMaker.next();

✅<비동기 작업의 동기적 표현(4) - Promise + Async/await>

ES2017에서 새롭게 추가된 async(비동기)/await(기다리다) 문 이용.

비동기 작업을 수행코자 하는 함수 앞에 async 함수 내부에서 실질적인 비동기 작업이 필요한 위치마다 **await**를 붙임.

Promise객체 ~ then(그러면~~)과 동일한 효과

var addCoffee = function (name) {
	return new Promise(function (resolve) {
		setTimeout(function(){
			resolve(name);
		}, 500);
	});
};
var coffeeMaker = async function () {
	var coffeeList = '';
	var _addCoffee = async function (name) {
		coffeeList += (coffeeList ? ', ' : '') + await addCoffee(name);
	};
	await _addCoffee('에스프레소');
	console.log(coffeeList);
	await _addCoffee('아메리카노');
	console.log(coffeeList);
	await _addCoffee('카페모카');
	console.log(coffeeList);
	await _addCoffee('카페라떼');
	console.log(coffeeList);
};
coffeeMaker();

'Javascript' 카테고리의 다른 글

DOM-API 실습  (1) 2023.12.19
DOM:Document object Model 기본 개념  (0) 2023.12.19
비동기 작업의 동기적 표현 - Promise  (0) 2023.12.19
콜백함수_promise  (1) 2023.12.18
콜백지옥 & 동기 비동기  (0) 2023.12.18