Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[8장] 비동기 프로그래밍, 동시성과 병렬성 #16

Open
dahye1013 opened this issue Aug 18, 2022 · 3 comments
Open

[8장] 비동기 프로그래밍, 동시성과 병렬성 #16

dahye1013 opened this issue Aug 18, 2022 · 3 comments

Comments

@dahye1013
Copy link
Member

[8장 퀴즈]

비동기 프로그래밍, 동시성과 병렬성

아래 마크다운을 복사 붙여넣기해서 코멘트로 퀴즈를 달아주세요 :)
객관식, 주관식에 상관없이 편하게 만들어주세요!

부가 설명을 달고 싶다면, 해설을 정답과 함께 옵션으로 작성하시면 됩니다. ☺️

예시

퀴즈 내용 객관식의 정답을 골라보세요!
(퀴즈 내용)
1. 1번 
2. 2번
3. 3번

<details>
	<summary>퀴즈 정답</summary>
	<div markdown="1">    
	정답은 1번!
	</div>
</details>
@jlee0505
Copy link
Member

jlee0505 commented Aug 22, 2022

Q1. 빈칸을 채워 넣으시오.

  1. 자바스크립트는 __ 스레드로 작업한다.
  2. 자바스크립트의 비동기 작업을 가능하게 해주는 건 _______이다.
  3. 간단한 비동기 작업에는 _______이 직관적이다. ()
  4. 복잡한 비동기 작업에는 프로미스, 또는 _______ 을 사용한다.
  5. 더 복잡한 비동기 작업(ex.이벤트를 다른 시점에 여러번 발생시킴)은 _______나 리액티브 스트림 라이브러리를 사용할 수 있다.

Q2. 아래와 같은 콜백 방식의 문제점을 해결할 수 있는 방법은?

async1((err1,res1) => { 
if(res1) {
async2(res1, (err2, res2) => {
if(res2) {
async3 (res2, (err3, res3) => {
 //...
})}})}})
퀴즈 정답
Q1 정답 1. 단일/싱글 2. 이벤트 루프 3. 콜백 4. async/await 5. 이벤트 방출기
Q2 정답
연달아 수행된는 작업을 코드로 표현하기 어렵다는 콜백 방식의 단점(콜백 피라미드)를 해결하기 위해서는 프로미스나, async/await 을 사용할 수 있습니다.

@dahye1013
Copy link
Member Author

자바스크립트 VM의 동시성을 거시적으로 묘사해주세요.

퀴즈 정답
  1. 메인 자바스크립트 스레드는 비동기 API를 호출한다.

  2. 네이티브 비동기 API를 호출 후 메인 스레드로 제어가 반환된다.

  3. 비동기 작업이 완료되면 태스크(task)를 이벤트 큐에 추가한다.

  4. 콜스택이 비면 이벤트 큐에 남아있는 태스크가 있는지 확인한다.

  5. 이벤트 큐에 태스크가 남아있으면 메인스레드에 올려 태스크를 수행 한다..

  6. 이를 반복하여 콜 스택과 이벤트 큐가 비고, 모든 비동기 네이티브 API 호출이 완료될 때까지 반복한다.

213page 참조

@dahye1013
Copy link
Member Author

dahye1013 commented Aug 22, 2022

아래 Promise 인터페이스를 수정해보세요.

[조건]

  1. 아래 Executor를 구체적인 타입으로 교체해주세요.
  2. promise만 보고도 어떤 타입으로 해석되어야하는지 알수 있도록 해주세요
type Executor = (
    resolve: Function,
    reject: Function
) => void

class Promise {
    constructor(f: Executor) {}
}
퀴즈 정답

promise만 보고도 어떤 타입으로 해석되어야하는지 알 수 있도록 Promise를 제너릭으로 만들면 됩니다. 생성자에서 자신의 타입 매개변수를 전달하는 방식으로 수정하면 아래처럼 구현할 수 있습니다.

type Executor<T> = (
    resolve: (result : T) => void,
    reject: (error: unknown) => void
) => void;

class Promise {
    constructor(f: Executor) {}
    then<U>(g: (result: T) => Promise<U>) : Promise<U> {}
    catch<U>(g: (result: unknown) => Promise<U>) : Promise<U> {}
}

구체적인 의미

  1. 모든 Promises는 거절되는 위험이 있으며, 정적으로 이를 확인 할 수 없다.
  2. Promise가 거부되어도 항상 Error 인 것은 아니다. 자바스크립트는 모든 것을 던질 수 있다. (즉, Error가 서브타입이라고 간주 할 수 없다.)
    (219~222page 참조)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants