function responseApi(){
fetch(`${$baseUrl}api/users`)
.then((response) => response.json())
.then((myJson)=> {
$userList.innerHTML = myJson.map(user => `
<button class="ripple" id=${++$userCount}>${user.name}</button>
`).join('');
clickUser();
$userList.append($userCreateButton);
$userList.append($userDeleteButton);
$userCreateButton.addEventListener('click',makeUser);
$userDeleteButton.addEventListener('click',deleteUser);
})
};
해당 코드는 fetch를 이용한 코드이다. 이를 async와 await을 이용해 바꿔보라고 하셔서 구글링을 바탕으로 바꾸어 보았다.
async await을 사용할때 알아야 할 부분
- (비동기함수를 포함하는 전체)함수에 async을 붙여준다.
- 비동기로 행동하는 부분에 대한 함수(delay)를 만들어준다. (await을 그 함수에 붙인다.)
- resolve를 return으로 바꾸어 리턴처리한다.
이를 토대로 진행을 해보자
async function responseApi(){
fetch(`${$baseUrl}api/users`)
.then((response) => response.json())
.then((myJson)=> {
$userList.innerHTML = myJson.map(user => `
<button class="ripple" id=${++$userCount}>${user.name}</button>
`).join('');
clickUser();
$userList.append($userCreateButton);
$userList.append($userDeleteButton);
$userCreateButton.addEventListener('click',makeUser);
$userDeleteButton.addEventListener('click',deleteUser);
})
};
Promise를 리턴하는 delay역할을 하는 곳은
fetch
부분 이므로 이를 분리시켜본다.
async function responseApi(){
const post = await delay();
....
};
function delay(){
return fetch(`${$baseUrl}api/users`)
}
(myJson)=> {
$userList.innerHTML = myJson.map(user => `
<button class="ripple" id=${++$userCount}>${user.name}</button>
`).join('');
clickUser();
$userList.append($userCreateButton);
$userList.append($userDeleteButton);
$userCreateButton.addEventListener('click',makeUser);
$userDeleteButton.addEventListener('click',deleteUser);
}
위의 코드의 역할은
function setUserName(myJson){
$userList.innerHTML = myJson.map(user => `
<button class="ripple" id=${++$userCount}>${user.name}</button>
`).join('');
clickUser();
$userList.append($userCreateButton);
$userList.append($userDeleteButton);
$userCreateButton.addEventListener('click',makeUser);
$userDeleteButton.addEventListener('click',deleteUser);
}
이렇게 새로 함수를 만들어 수행시킨다.
async function responseApi(){
try {
const response = await delay();
const post = await response.json();
await setUserName(post);
}
catch(err){
alert(err);
}
};
function delay(){
return fetch(`${$baseUrl}api/users`)
}
function setUserName(myJson){
$userList.innerHTML = myJson.map(user => `
<button class="ripple" id=${++$userCount}>${user.name}</button>
`).join('');
clickUser();
$userList.append($userCreateButton);
$userList.append($userDeleteButton);
$userCreateButton.addEventListener('click',makeUser);
$userDeleteButton.addEventListener('click',deleteUser);
}
사실
delay
함수를 따로 안만들어도 상관은 없다. 그러나 내가 헷갈려서 일단 만들어봄....
async function responseApi(){
const response = await fetch(`${$baseUrl}api/users`)
const post = await response.json();
await setUserName(post);
};
function setUserName(myJson){
$userList.innerHTML = myJson.map(user => `
<button class="ripple" id=${++$userCount}>${user.name}</button>
`).join('');
clickUser();
$userList.append($userCreateButton);
$userList.append($userDeleteButton);
$userCreateButton.addEventListener('click',makeUser);
$userDeleteButton.addEventListener('click',deleteUser);
}
fetch에서는 then으로 받으면서 catch로 error를 잡는 수행을 하였다.
async await에서는 try catch문을 이용한다.
async function responseApi(){
try{
const response = await fetch(`${$baseUrl}api/users`)
const post = await response.json();
await setUserName(post);
}
catch(err){
alert(err);
}
};
function setUserName(myJson){
$userList.innerHTML = myJson.map(user => `
<button class="ripple" id=${++$userCount}>${user.name}</button>
`).join('');
clickUser();
$userList.append($userCreateButton);
$userList.append($userDeleteButton);
$userCreateButton.addEventListener('click',makeUser);
$userDeleteButton.addEventListener('click',deleteUser);
}
해당 await에서 문제가 발생하면 catch로 err를 처리한다.
- fetch함수는 XMLHttpRequest, JSON과 마찬가지로 AJAX를 위한 개념이다.
- 콜백지옥 싫다.
- Promise를 이용하자.
- fetch는 Promise와 관련된 일종의 개념이다.
- fetch를 통해 then catch를 하며 비동기를 진행한다.
- 그런 fetch도 async await을 이용해 함수를 통해 좀 더 보기좋게 나타낼 수 있다.
- async await을 통해 만들어진 내용을 try catch문을 이용해 에러를 탐지한다.