[JS CS] Promise, axios, async-await
작성:    
업데이트:
카테고리: JS CS
태그: FE Language, JS, JS CS
Promise
Promise object와 method
비동기 작업의 최종 완료 또는 실패를 나타내는 객체
- 미래의 완료 또는 실패와 그 결과 값을 나타냄
- 미래의 어떤 상황에 대한 약속
성공(이행)에 대한 약속
- .then(callback)
- 이전 작업(promise)이 성공했을 때 수행할 작업을 나타내는 callback 함수
- 각 callback 함수는 이전 작업의 성공 결과를 인자로 전달 받음
- 성공했을 때의 코드를 callback 함수 내에 작성
- 코드가 피라미드 형태로 들어가지 않아 깊이를 얕게 유지
실패(거절)에 대한 약속
- .catch()
- .then이 하나라도 실패하면(거부되면) 동작(동기식의 ‘try-except’ 구문과 유사)
- 이전 작업의 실패로 인해 생성된 error 객체는 catch 블록 안에서 사용 가능
- 각각의 .then() 블록은 서로 다른 promise 반환
- 즉, .then()을 여러 개 사용(chaining)하여 연쇄적인 작업을 수행 가능
-
결국 여러 비동기 작업을 차례대로 수행할 수 있다는 뜻
- .then()과 .catch() 메서드는 모두 promise를 반환하기 때문에 chaining 가능
주의사항
- 반드시 반환값이 있어야 함
- 없다면 callback 함수가 이전의 promise 결과를 받을 수 없음
.finally(callback)
- Promise 객체를 반환
- 결과와 상관없이 무조건 지정된 callback 함수가 실행
- 어떠한 인자도 전달받지 않음
-
Promise가 성공 여부를 판단할 수 없기 때문
- 무조건 실행되어야 하는 절에서 활용
- .then()과 .catch() 블록에서의 코드 중복을 방지
Promise가 보장하는 것
- Async callback 작성 스타일과 달리 Promise가 보장하는 특징
- callback 함수는 JavaScript의 Event Loop가 현재 실행 중인 Call Stack을 완료하기 이전에는 절대 호출되지 않음
- Promise callback 함수는 Event Queue에 배치되는 엄격한 순서로 호출
- 비동기 작업이 성공하거나 실패한 뒤에 .then() 메서드를 이용하여 추가한 경우에도 1번과 똑같이 동작
- .then()을 여러 번 사용하여 여러 개의 callback 함수를 추가할 수 있음(Chaining)
- 각각의 callback은 주어진 순서대로 하나하나 실행하게 됨
- Chaining은 Promise의 가장 뛰어난 장점
Axios
- Promise base HTTP client for the browser and Node.js
- 브라우저를 위한 Promise 기반의 클라이언트
- 원래는 “XHR”이라는 브라우저 내장 객체를 활용하기 위해 AJAX 요청을 처리하는데, 이보다 편리한 AJAX 요청이 가능하도록 도움을 줌
- 확장 가능한 인터페이스와 함께 패키지로 사용이 간편한 라이브러리를 제공
axios.get('https://jsonplaceholder.typicode.com/todos/1/') // Promise return
.then(...)
.catch(...)
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
const URL = 'https://jsonplaceholder.typicode.com/todos/1/'
axios.get(URL)
.then(res => console.log(res.data.title))
.catch(err => console.log('Error!'))
</script>
axios 예시
const URL = 'https://jsonplaceholder.typicode.com/todos/1/'
axios.get(URL).then
.then(function (response) {
console.log(response)
return response.data
})
.then(function (data) {
return data.title
})
.then(function (title) {
console.log(title)
})
.catch(function (error) {
console.log(error)
})
.finally(function () {
console.log('이건 무조건 실행')
})
async & await
- ECMA2017 (ES8)에서 등장한 비동기 코드를 작성하는 새로운 방법
- 기존 Promise 시스템 위에 구축된 syntactic sugar
- Promise 구조의 then chaining을 Queue에- 비동기 코드를 조금 더 동기 코드처럼 표현
- Syntactic sugar
- 더 쉽게 읽고 표현할 수 있도록 설계된 프로그래밍 언어 내의 구문
- 문법적 기능은 그대로 유지하되, 사용자가 직관적으로 코드를 읽을 수 있게 만듦
사용 방법
- Promise 방식의 코드를 함수로 묶는다.
- 해당 함수 맨 앞에 async라는 키워드로 표시를 남긴다.
- 함수 블록 내부에, 비동기로 동작하는 함수들을 찾아 앞에 await를 남긴다.
댓글남기기