js - promise

리리·2021년 7월 14일

TIL

목록 보기
3/22
/*
생성자를 통해서 새로운 프로미스 객체를 만들 수 있다. 
생성자의 인자로 executor라는 하마수를 이용한다.
*/

// new Promise(/*excutor*/); 

// /* excoutor 함수는 resolve와 reject 를 인자로 가진다
// 	(resolve, reject) => { ...}
// resolve와 reject는 함수. 
// 	resolve(), reject() */

// new Promise(/*executor */  (resolve, reject) => {});

// // 생성자를 통해서 프로미스 객체를 마나드는 순간 pending(대기)상태가 된다.

// new Promise((resolve, reject) => {} ); //만든 순간 대기상태가 된다. 

// // executor 함수 인자 중 하나인 resolve 함수를 실행하면, fulfilled(이행 )상태가 된다. 

// new Promise((resolve, reject) => {
// 	//...
// 	resolve(); //fulfilled상태로 돌입한다. 
// })

// excutor 함수 인자 중 하나인 reject함수를 실행하면 rejected(거부)상태가 된다. 

// new Promise((resolve, reject) => {
// 	reject(); //rejected 상태가 돌입한다. 
// })

// new Promise((resolve, reject) => {
// 	/* pending */ 
// 	setTimeout(() => {
// 		resolve();/* fulfilled */
// 	}, 1000);
// })

// p 라는 프로미스 객체가 fulfilled 되는 시점에 p.then 안에 설정한 callback 함수가 실행된다.
// const p = new Promise((resolve, reject) => {
// 	/* pending */
// 	setTimeout(() => {
// 		resolve();/* fulfilled */
// 	}, 1000);
// })
// p.then(/*callback*/() => {
// 	console.log('1000ms 후에 fulfilled됩니다.')
// })

// /* then을 설정하는 시점을 정확히하고, 
// 함수의 실행과 동시에 프로미스 객체를 만들면서 pending 이 시작하도록 하기 위해 
// promise객체를 생성하면서 리턴하는 함수 (p)를 만들어 함수 (p)실행과 동시에 then을 설정한다.  */

// function p() {
// 	return new Promise((resolve, reject) => {
// 		/* pending */
// 		setTimeout(() => {
// 			resolve();/* fulfilled */
// 		}, 1000);
// 	})
// }
// p.then(/*callback*/() => {
// 	console.log('1000ms 후에 fulfilled됩니다.')
// })

// // 마친가지로 프로미스 객체가 reject되는 시점에 p.catch 안에 설정한 callback 함수가 실행된다. 

// function p() {
// 	return new Promise((resolve, reject) => {
// 		/* pending */
// 		setTimeout(() => {
// 			reject();/* rejected */
// 		}, 1000);
// 	})
// }

// p()
// 	.then(/*callback*/() => {
// 		console.log('1000ms 후에 fulfilled됩니다.')
// 	})
// 	.catch(() => {
// 		console.log('1000ms 후에 rejected됩니다.')
// 	});

/* excutor 의 resolve 함수를 실행할 때 인자를 넣어 실행하면, then 의 callback 함수를 인자로 받을 수 있다. 
	resolve('hello');
	then((message) => {...}) 
*/
function p() {
	return new Promise((resolve, reject) => {
		/* pending */
		setTimeout(() => {
			// resolve('hello');/* fulfilled */
			reject('error'); /* rejected */
		}, 1000);
	})
}

p()
	.then(/*callback*/(message) => {
		console.log('1000ms 후에 fulfilled됩니다.', message)
	})
	.catch((reason) => {
		console.log('1000ms 후에 rejected됩니다.', reason)
	});

/* 보통 reject 함수를 실행하며 rejected 되는 이유를 넘기는데, 표준 내장 객체인 Error 의 생성자를 이용하여 Error 객체를 만든다.  */

function p() {
	return new Promise((resolve, reject) => {
		/* pending */
		setTimeout(() => {
			// resolve('hello');/* fulfilled */
			reject(new Error('bad')); /* rejected */
		}, 1000);
	})
}

p()
	.then(/*callback*/(message) => {
		console.log('1000ms 후에 fulfilled됩니다.', message)
	})
	.catch((error) => {
		console.log('1000ms 후에 rejected됩니다.', error)
	});

/* fulfilled 되거나 rejected 된 후에 최종적으로 실행할 것이 있다면, .finally()를 설정하고, 함수를 인자로 넣는다. */

function p() {
	return new Promise((resolve, reject) => {
		/* pending */
		setTimeout(() => {
			// resolve('hello');/* fulfilled */
			reject(new Error('bad')); /* rejected */
		}, 1000);
	})
}

p()
	.then(/*callback*/(message) => {
		console.log('1000ms 후에 fulfilled됩니다.', message);
	})
	.catch((error) => {
		console.log('1000ms 후에 rejected됩니다.', error);
	})
	.finally(() => {
		console.log('end');
	});

/* 보통 비동기 작업을 할 때, callback 함수를 인자로 넣어 로직이 끝나면 callback 함수를 호출한다. 이런 경우 함수가 아래로 진행되지 않고, callback 함수 안으로 진행된다. */

function c(callback) {
	setTimeout(() => {
		callback();
	}, 1000);
}
c(() => {
	console.log('1000ms 후에 callback 함수가 실행됩니다.')
});
c(() => {
	c(() => {
		console.log('2000ms 후에 callback 함수가 실행됩니다.')
	});
});

/* then 함수에서 다시 프로미스 객체를 리턴하느 방법을 통해 체이닝하면, 비동기 작업을 순차적으로 아래로 표현할 수 있다. 
then 에 함수를 넣는 여러 방법을 확인해보자. */

function p() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {

		}, 1000);
	});
}
p()
.then(() => {
	return p();
}) // 1초 후에 불림
.then(()=> p()) // 2s 후에 불림
.then(p) //3초 후에 불림
.then(() => {
	console.log('4000ms 후에 fulfilled가 됩니다.');
})

/* 
value 가 프로미스 객체인지 아닌지 알 수 없는 경우, 사용하면 연결된 then 메서드를 실행합니다. 
value 가 프로미스 객체이면, resolve 된 then 메서드를 실행.
value 가 프로미스 객체가 아니면, value 를 인자로 보내면서 then 메서드를 실행
 */

Promise.resolve(/* value */);

Promise.resolve(new Promise((resolve, reject) => {
	setTimeout(() => {
		resolve('foo');
	}, 1000);
})).then((data) => {
	console.log('프로미스 객체인 경우, resolve 된 결과를 받아 then 이 실행이 된다', data);
});

Promise.resolve('bar').then(data => {
	console.log('then 메서드가 없는 경우, fulfilled 됩니다.', data);
});

/* promise.reject를 사용하면, catch 로 연결된 rejected 상태로 변경된다. */

Promise.reject(/* value */);

Promise.reject(new Error('reason'))
	.then(error => {})
	.catch(error => {
		console.log(error);
	});

/* Promise 객체 여러개를 생성하여,
배열로 만들어 인자로 넣고 Promise.all을 실행하면, 배열의 모든 프로미스 객체들인 fulfilled 되었을 때, then의 함수가 실행됩니다.
then의 함수의 인자로 프로미스 객체들의 resolve 인자값을 배열로 돌려준다 */

// Promise.all([프로미스 객체들]);

function p(ms) {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			resolve(ms);
		}, ms);
	})
}
Promise.all([p(1000), p(2000), p(3000)]).then((messages) => {
	console.log('모두 fulfilled 된 이후에 실행된다.', messages);
})
// 모두 fulfilled 된 이후에 실행된다. [1000, 2000, 3000]

/* 
프로미스 객체를 여러개 생성하여, 배열로 만들어 인자로 넣고 Promise.race를 실행하면, 
배열의 모든 프로미스 객체들 중 가장 먼저 fulfilled 된 것으로, then 의 함수가 실행된다.
then의 함수의 인자로 가장 먼저 fulfilled 된 프로미스 객체의 resolve 인자값을 돌려준다. */

// Promise.race([프로미스 객체들])

function p(ms) {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			resolve(ms);
		}, ms);
	})
}
Promise.race([p(1000), p(2000), p(3000)]).then((messages) => {
	console.log('가장 빠른 하나가 fulfilled 된 이후에 실행된다.', messages);
})
// 가장 빠른 하나가 fulfilled 된 이후에 실행된다. 1000

0개의 댓글