All Articles

자바스크립트 비동기-동기

Promise

  • 실행할 비동기 함수들을 배열에 담에 순차적으로 실행하는 것을 공부해 보았습니다.

첫번째

  1. 비동기처럼 작동하는 테스트 함수. 프로미스객체로 만든다.
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함수는 프로미스를 반환하는 함수실행 직후 바로 동작하지 않고, 배열의 모든 함수가 종료되어야 작동한다.

동기적으로 처리할 함수가 종료되는 즉시 파라메터를 받아와 바로 실행하기 위해서 아래처럼 코드를 짜보았다.

두번째

  1. 함수가 종료된 직후 반환값을 이용하여 즉시 다른 함수를 호출하기
// 비동기처럼 작동하는 함수를 만들어준다.
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을 사용하여 동기 처리를 하기 위해서, 비동기 로직을 동기로 실행하기 위한 공부를 해보았다.

다음번엔 제너레이터를 활용하여 공부해야겠다.