1. 비동기 작업을 수행하는 것 : setTime, setInterver, request, event(load)
-> 비동기 작업 사용 이유 : 하나의 작업을 기다리지 않고 동시 다발적으로 작업을 수행하기 위함
2. 비동기 작업의 결과를 사용하기 위해서 call back 함수를 이용한다.
-> call back 함수가 없는 비동기 특성상 언제 함수가 종료 될 지 모르기 때문에 ' 비동기 함수 ' 와 ' 비동기 함수 "내부의 진짜 비동기 함수" ' 가 수행 될 경우 비동기 함수가 먼저 종료 되고, 나중에 비동기 함수 내부의 진짜 비동기 함수가 마무리 된다.
-> call back 함수가 존재시, 매개변수에 외부함수를 넣기 때문에 비동기 결과를 가져 올 수 있다.
3. 콜백함수의 2가지 단점을 해결하기 위해서 Promise가 생겼다.
1) 병렬적이지 않은 콜백지옥
2) 예외 처리 불안정
4. Promise는 객체로 내부에 비동기 함수가 존재하고, 내부적으로 가지고 있는 1) 성공처리시 받는 콜백함수인 resolve 2) 실패처리시 받는 콜백함수인 reject 객체가 생성된다.
5. Promise 객체는 개별적으로 작동하고 해당 Promise 객체의 콜백함수를 호출하기 위해서 1) 성공처리 객체를 받는 then 2) 실패처리 객체를 받는 catch가 존재한다.
6. Promise 객체는 병렬적으로 연결이 되고, 중간에 catch있으면 catch 처리되고 아니면 중간에 멈춘다.
7. Promise 끼리는 비동기지만 순서가 존재하고, Promise 외적의 JS들간에는 비동기적으로 작동을 하는게 최종 핵심이다.
맞습니다. Promise는 비동기 작업을 처리하고, 그 결과를 나타내기 위한 객체입니다. Promise 객체 내부에서 비동기 작업을 수행하고, 작업이 완료되면 결과를 resolve 함수로 나타내거나 실패 시 reject 함수로 나타냅니다.
일반적으로 Promise는 다음과 같은 형태로 사용됩니다:
위의 코드에서 myAsyncFunction은 Promise 객체를 반환하는 비동기 함수입니다. then 메서드는 비동기 작업이 성공했을 때 호출되는 콜백 함수를 등록합니다. catch 메서드는 비동기 작업이 실패했을 때 호출되는 콜백 함수를 등록합니다.
이렇게 Promise를 사용하면 비동기 작업의 결과를 다루기 위해 콜백 헬(callback hell)을 피하고, 보다 구조화된 형태로 비동기 코드를 작성할 수 있습니다. 또한, 여러 개의 Promise를 연결하거나 병렬로 처리하는 등의 고급 비동기 제어도 가능합니다.
맞습니다, 여러 개의 Promise를 연결하여 .then() 메서드를 연속적으로 호출할 수 있습니다. 이를 Promise 체인(Promise chaining)이라고도 합니다.
Promise 체인은 각 .then() 메서드에서 이전 Promise의 결과를 받아 처리하고, 다음 Promise를 반환하는 방식으로 동작합니다. 이렇게 하면 비동기 작업의 연속적인 처리를 구현할 수 있습니다. 각 .then() 메서드에서 반환된 Promise의 결과는 다음 .then() 메서드로 전달되어 처리됩니다.
예를 들어, 다음과 같이 두 개의 비동기 작업을 연결하여 처리하는 Promise 체인을 만들 수 있습니다:
위의 예시에서 asyncTask1은 첫 번째 비동기 작업을 수행하고, asyncTask2는 두 번째 비동기 작업을 수행합니다. 첫 번째 .then() 메서드에서는 asyncTask1의 결과를 받아서 asyncTask2를 호출하고, 두 번째 .then() 메서드에서는 asyncTask2의 결과를 처리합니다. 이런 식으로 필요한 만큼의 .then() 메서드를 연속적으로 호출하여 여러 비동기 작업을 처리할 수 있습니다.
catch() 메서드는 어떤 .then() 메서드에서든 발생하는 에러를 처리하는 역할을 합니다. Promise 체인 중 어느 곳에서든 에러가 발생하면 해당 에러를 처리하기 위해 catch() 메서드가 호출됩니다.
Promise 체인을 사용하면 비동기 작업의 순차적인 흐름을 보다 명확하게 표현할 수 있고, 에러 처리도 간편하게 할 수 있습니다.
Promise 체인에서 catch() 메서드는 해당 Promise 체인 내에서 발생한 모든 에러를 처리합니다. 중간에 발생한 에러가 catch() 메서드에 의해 처리되면, 그 이후의 Promise 체인은 정상적으로 계속 진행됩니다.
예를 들어, 다음과 같은 Promise 체인이 있다고 가정해봅시다:
위의 예시에서, 만약 asyncTask2 또는 asyncTask3에서 에러가 발생한다면, 해당 에러는 catch() 메서드에 의해 처리됩니다. 그리고 이후의 .then() 메서드는 정상적으로 호출되어 실행됩니다. 이는 .catch() 메서드 이후에 있는 .then() 메서드들이 Promise 체인의 마지막에서도 동작하기 때문입니다.
따라서, Promise 체인 중간에 에러가 발생하더라도 .catch() 메서드에 의해 처리되면 이후의 Promise 체인은 계속 진행됩니다. 하지만 .catch() 메서드가 없는 경우, 중간에 발생한 에러는 이후의 .then() 메서드로 전달되지 않고, Promise 체인이 중단됩니다.
정확히 말씀드리자면, .catch() 메서드를 사용하지 않고 중간 Promise에서 에러가 발생하면, 해당 에러는 이후의 .then() 메서드로 전달되지 않고, Promise 체인이 중단됩니다. 즉, 이후의 Promise는 작동하지 않습니다.
예를 들어, 다음과 같은 Promise 체인이 있다고 가정해봅시다:
위의 예시에서, asyncTask2의 실행 중 에러가 발생하면, 에러는 이후의 .then() 메서드로 전달되지 않고 바로 .catch() 메서드로 이동합니다. 따라서, .then(result3)는 실행되지 않습니다. 이후의 Promise 체인은 중단되고, 에러는 .catch() 메서드에서 처리됩니다.
따라서, 중간 Promise에서 에러가 발생하면, 이후의 Promise는 작동하지 않습니다. 에러 처리를 위해서는 .catch() 메서드를 적절하게 사용해야 합니다.
Promise는 비동기 작업을 처리하면서도 순차적인 동작을 보장하는 메커니즘을 제공합니다. 여러 개의 Promise를 연결하면, 이전 Promise의 작업이 완료된 후에 다음 Promise가 실행됩니다. 이렇게 Promise 체인이 형성되면, 각 Promise는 순차적으로 실행되어야 하는 작업들을 보장합니다.
Promise는 내부적으로 비동기 작업을 처리하는데, 이는 일반적으로 네트워크 요청, 파일 읽기/쓰기, 데이터베이스 쿼리 등과 같은 I/O 작업입니다. 이러한 비동기 작업은 백그라운드에서 실행되며, Promise는 작업이 완료될 때까지 기다리는 동안 다른 코드나 작업이 실행될 수 있도록 합니다.
즉, Promise 체인 내에서는 각 Promise가 순차적으로 실행되지만, Promise 내부의 비동기 작업은 별도의 스레드 또는 이벤트 루프를 통해 동작하므로 다른 코드들과 동시에 실행될 수 있습니다. 이를 통해 비동기 작업의 결과를 기다리는 동안 CPU를 다른 작업에 활용할 수 있습니다.
맞습니다. Promise 체인 내부에서는 각각의 함수가 비동기적으로 실행되기 때문에, Promise 체인과 관련된 작업들은 순서대로 실행되지만, 다른 비동기 작업이나 코드들은 멀티스레드처럼 동시에 실행될 수 있습니다.
Promise 체인 내의 함수들은 비동기 작업을 수행하고 그 결과를 다음 Promise로 전달하는 역할을 합니다. 이 때, 비동기 작업이 진행되는 동안 이벤트 루프를 통해 다른 비동기 작업이나 코드들이 실행될 수 있습니다. 이러한 동작 방식은 JavaScript 엔진의 비동기 처리 메커니즘과 관련이 있으며, 이벤트 루프를 통해 비동기 작업들이 스케줄링되고 실행되는 방식입니다.
따라서, Promise 체인 내의 함수들은 순차적으로 실행되지만, 다른 비동기 작업들은 동시에 실행될 수 있으므로 멀티스레드처럼 동작할 수 있습니다. 이는 JavaScript의 비동기 처리 메커니즘의 특성 중 하나입니다.