Javascript를 배우고 있습니다. 매일 배운 것을 이해한만큼 정리해봅니다.
const app =
{
server : "서버주소",
roomList : [],
newChat : {
username : "Elsa",
text : "",
roomname: " "
},
// http get을 통해서 chats를 받아오는 promise 함수 리턴
fetch : async () => {
return window
.fetch(app.server)
.then(resp => resp.json())
.then(json => json);
},
// http post를 통해서 chat을 등록하는 promise 함수 리턴
send : async newChat => {
return window
.fetch(app.server, {
method : "POST",
body : JSON.stringify(newChat),
headers : {
"Content-Type" : "application/json"
}
}).then(resp => resp.json())
.then(json => console.log(json));
},
// json으로 받은 msgs를 순회하면서 chat으로 render
renderMessage : msgs => {
const chats = document.querySelector("#chats");
app.clearMessages();
for (let i = 0; i < msgs.length; i++) {
chats.prepend(createMsgSet[msgs[i]]);
}
},
// 전체 dom의 메시지 clear
clearMessages: () => {
const chats = document.getElementById("chats");
chats.innerHTML = "";
},
//로딩과 동시에 실행되는 함수
init: async () => {
const msgs = await app.fetch(); //fet API로 json형태 msg get
app.renderMessage(msgs); // 메시지 렌더
renderRoomName(msgs); // 룸 옵션 렌더
submitHandler(); // 신규 chat 제출 시 핸들러
roomSelectHandler(msgs); //룸 필터 시 핸들러
clearBtnHandler(); // clear 버튼 클릭 시 핸들러
}
}
.then(callback)
으로 아주 깔끔하게 처리되어 있다. 비동기 작업 직후 then으로 콜백 함수를 넘겨주는 방법이 있다는 것을 잊지 말아야 겠다.const app =
{
server: '서버주소',
// app.init으로 app을 초기화합니다.
init: () => {
app.addEventHandlers();
app.fetch(json => {
json.forEach(app.renderMessage);
});
},
// app.fetchAndRender는 서버에 대한 요청 결과를 받고, app.renderMessage를 실행시킵니다.
fetchAndRender: () => {
app.fetch(data => {
data.forEach(app.renderMessage);
});
},
// app.addEventHanders는 이벤트 리스너로 app.handleSubmit을 추가시키는 역할을 합니다.
addEventHandlers: () => {
let submit = document.querySelector('#send .submit');
if (submit) {
submit.addEventListener('submit', app.handleSubmit);
}
},
// app.fetch를 통해, 서버에 대한 GET 요청 결과를 어떠한 callback에게 넘깁니다.
fetch: callback => {
window
.fetch(app.server)
.then(resp => {
return resp.json();
})
.then(callback);
},
// app.send를 통해서는 서버에 대한 POST 요청 결과를 특정 callback에게 넘깁니다.
send: (data, callback) => {
window
.fetch(app.server, {
method: 'POST',
body: JSON.stringify(data),
headers: {
'Content-Type': 'application/json'
}
})
.then(resp => {
return resp.json();
})
.then(callback);
},
// app.clearMessages로 id가 chat인 요소를 비워줍니다.
clearMessages: () => {
document.querySelector('#chats').innerHTML = '';
},
// app.clearForm으로 Form을 비워줍니다.
clearForm: () => {
document.querySelector('.inputUser').value = '';
document.querySelector('.inputChat').value = '';
},
// app.renderMessage로 아래의 template code를 dom에 넣어줍니다.
renderMessage: ({ username, text, date, roomname }) => {
const tmpl =
`<div class="chat">
<div class="username">${username}</div>
<div>${text}</div>
<div>${date}</div>
<div>${roomname}</div>
</div>`;
document.querySelector('#chats').innerHTML =
tmpl + document.querySelector('#chats').innerHTML;
},
// app.handleSubmit은 event 처리 로직을 구현합니다.
handleSubmit: e => {
e.preventDefault();
app.clearMessages();
app.send(
{
username: document.querySelector('.inputUser').value,
text: document.querySelector('.inputChat').value,
roomname: '코드스테이츠'
},
() => {
app.fetchAndRender();
app.clearForm();
}
);
};
}
// app.init()을 실행합니다.
app.init();