1. Producer

    when new Promise is created, the executor runs automatically

    const promise = new Promise((resolve, reject) ⇒ {
    
    console.log('doing something...');
    	setTimeout(() => {
    		//resolve('ellie');
    		reject(new Error('no network'))
    	}, 2000);
    });
    
  2. Consumers: then, catch, finally

    promise
    .then((value) => {
    	console.log(value);
    })
    .catch(error => {
    	console.log(error);
    })
    .finally(() => {
    	console.log('finally')
    });
    
  3. Promise chaining

    const fetchNumber = new Promise((resolve, reject) => {
    	setTimeout(()=> resolve(1), 1000);
    });
    
    fetchNumber
    .then(num => num * 2)
    .then(num => num * 3)
    .then(num => {
    	return new Promise((resolve, reject) => {
    		setTimeout(()=> resolve(num -1), 1000);
    	});
    })
    .then(num => console.log(num));
    
  4. Error Handling

    const getHen = () =>
    	new Promise((resolve, reject) => {
    		setTimeout(() => resolve('닭'),1000);
    	});
    const getEgg = hen =>
    	new Promise((resolve, reject) => {
    		//setTimeout(() => resolve(`${hen} => 계란`), 1000);
    		setTimeout(() => reject(new Error(`error! ${hen} => 계란`)), 1000);
    	});
    const cook = egg =>
    	new Promise((resolve, reject) => {
    		setTimeout(() => resolve(`${egg} => 후라이`), 1000);
    });
    
    getHen()
    .then(getEgg) //이렇게로도 가능 아래와 같음
    .catch(error => {
    	return '빵';
    })
    .then(egg => cook(egg))
    .then(meal => console.log(meal));
    .catch(console.log);
    
    getHen().then(getEgg).then(cook).then(console.log);