카카오콘
687
2021-07-25 02:28:49
3
199

Async, Await을 사용할 때 이런 상황을 해결할 로직이 있을까요?



(이전 promise 글은 제가 글쓰고 잠시후에 다시 정리하다 깨달아서 삭제하였습니다. 양해 바랍니다.)


현재 제가 이해한 선에선 Async, Await, promise.. 등등..  모두


한가지 비동기 통신이 있을때 해당 코드가 끝나기전엔,

해당 비동기통신과 연결된 코드는 전부 멈춘다는 점입니다.


그렇다면 상황을 가정해보겠습니다.

다만, 제가 쓰면서도 뭔가 말이 안되는 듯 하여 해결방법이 없거나 이렇게 구현해서는 안되는 로직일 수 있습니다.  하지만 세상일 모르는거니..

아니다, 충분히 일리가 있는 문제다 라고 하신다면 해결과 관련된 답변을

말이 안된다. 이렇게 하면 안되고 구현도 못한다. 라고 하신다면 그렇게 답변을 부탁드립니다.



1. 데이터를 필요로 하는 1번 메소드가 있습니다. (데이터를 받아 여러 작업이 수행됩니다.)

2. API 로 데이터를 가져오는 느린 통신메소드가 있습니다.

3. 그리고 1번과 2번 모두 상기 동작 외에 통신과 관련없는 부가적인 코드가 수행되어야 합니다.

(이벤트 핸들러나, 테이블을 그리는 동작들로 가정해보겠습니다.)


즉, 2번메소드는 통신하며 함수가 끝났을때는 데이터를 리턴하지만

그 통신이 끝나기전엔 여러 이벤트핸들러와 관련된 로직이 실행되어야 합니다.

.

또한 1번 메소드는 2번 메소드의 데이터가 오기를 기다리지만,

데이터가 오기전엔 할일이 없으니 테이블을 그리려고 합니다.


그러나 위에 언급했다싶이 이해한대로 이야기를 해본다면


2번 메소드를 먼저 호출하여 데이터가 먼저 불러져와야 1번 메소드에서 사용할 수 있으니

2번 메소드를 먼저 호출합니다.

그렇게 2번 메소드가 호출되었을때 데이터를 리턴해주기전까지 이벤트? 얼마든지 설정해줄 수 있습니다.

그러나 1번메소드는 절대 테이블을 그리지 못합니다. 호출이 되질 못했으니까요.


그렇다면 반대로

1번메소드를 먼저 호출합니다. 그리고 변수에 2번 메소드를 호출하여 데이터를 저장시키게 합니다.

하지만 그냥 써서는 바로 넘어가버리니, 이 통신이 끝나고 정상적으로 데이터가 변수에 저장될때까지 대기하게 합니다.


그렇다면 이번 경우의 수 역시 2번 메소드 내부의 내용이 더 빠르게 실행되고 이벤트가 연결된 후 데이터가 리턴되고,

그제서야 대기가 풀린 1번의 나머지 테이블 그리는 코드가 실행될거라고 생각합니다.



즉 제가 현재까지 이해한 바로는 제 의문점에 대한 해결방법이 떠오르지 않습니다.


비동기 통신이 필요한 부분은 자기들끼리 돌아가되, 관련 없는 나머지 코드들은 순차적으로 수행되어야 할 것..


이런 방법이 존재할까요? 

(따로 올바르게 메소드를 뺀다던가.. 그런 방법을 원하는것은 아닙니다.)



0
  • 답변 3

  • yeori
    2k
    2021-07-25 09:57:10
    (따로 올바르게 메소드를 뺀다던가..
    그런 방법을 원하는것은 아닙니다.)

    이게 맞습니다.

  • 마르세유1
    1k
    2021-07-25 10:36:58

    async/await 같은 문법은 마법이 아니에요. 단지 future/promise를 간편하게 쓰기 위한 예약어입니다.

    또한 future/promise도 worker thread에 task를 위임해서 수행후에 결과를 받을수있는 객체일뿐 마법이 아닙니다.


    이 전제를 잘 생각하시고 설계를 해보세요!

    잘 생각이 안나시면 future/promise 를 좀더 공부하시면 답이 나오실겁니다.

  • 카카오콘
    687
    2021-07-25 13:35:44 작성 2021-07-25 13:36:03 수정됨

    새벽에 갑자기 든 의문이라 혹시나 해서 질문드려봤습니다.


    역시 너무 억지였군요 ㅎㅎ;;;


    답변주신분들 정말 감사합니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.