Promise
- 실행할 비동기 함수들을 배열에 담에 순차적으로 실행하는 것을 공부해 보았습니다.
첫번째
- 비동기처럼 작동하는 테스트 함수. 프로미스객체로 만든다.
const promiseFunc = n => async m => new Promise(res =>
{
console.log(n,m,'started');
return setTimeout(() => res(n), m)
})
// 프로미스의 반환값을 이용하는 다른 함수
const getResolve = value => console.log(`Finished ${value}`)
// 실행할 순서대로 배열에 넣어준다.
const promiseArry = (x, y) => async promiseFunc =>
{
const [a,b,c,d] = [
await promiseFunc(x)(y),
await promiseFunc(x - 3)(y - 3000), //2초 -> 가장먼저 호출
await promiseFunc(x - 4)(y - 4000), //1초 -> 3초뒤 호출
await promiseFunc(x - 5)(y - 5000), ]//0초 -> 마지막으로 호출
// 프로미스 반환 값을 가져왔지만 아래처럼 호출하면
//함수실행 직후 바로 작동하지 않는다. !! 아래 2번째 방법 참고*
getResolve(a);getResolve(c)
}
// 함수 호출
promiseArry(5, 5000)(asyncFunc)
log함수는 프로미스를 반환하는 함수실행 직후 바로 동작하지 않고, 배열의 모든 함수가 종료되어야 작동한다.
동기적으로 처리할 함수가 종료되는 즉시 파라메터를 받아와 바로 실행하기 위해서 아래처럼 코드를 짜보았다.
두번째
- 함수가 종료된 직후 반환값을 이용하여 즉시 다른 함수를 호출하기
// 비동기처럼 작동하는 함수를 만들어준다.
const promiseFunc = (n, delay) => new Promise(res =>
{
console.log(`Started ${n}. Will finish after ${delay}ms`)
return setTimeout(() => res(n), delay)
})
// 해당 함수의 프로미스 반환 값을 사용할 다른 함수를 짜본다.
const getResolve = value => console.log(`Finished ${value}`)
그리고 함수를 호출할 배열을 만들어준다.
then을 사용하므로써, 함수 실행후 반환값을 다른 함수에 사용하기위해 배열 내부에서 메서드 체이닝으로 함수를 호출
const promiseArry = async delay =>
[ //배열이자 함수 그자체.
await promiseFunc(0, delay).then(getResolve), //5초
await promiseFunc(1, delay - 2000).then(getResolve), //3초
await promiseFunc(2, delay - 4000).then(getResolve) //1초
]
promiseArry(5000)
setTimeout을 사용하여 동기 처리를 하기 위해서, 비동기 로직을 동기로 실행하기 위한 공부를 해보았다.
다음번엔 제너레이터를 활용하여 공부해야겠다.