동기 호출
클라이언트(서버로 접속하는 컴퓨터)가 서버(서비스, 리소스 등을 제공하는 컴퓨터)로 무언가를 요청했을 때, 응답(response)가 올 때까지 어떠한 작업도 하지 않고 대기하다가 응답이 오는 순간부터 작업을 진행한다.
비동기 호출
클라이언트에서 서버에 A라는 작업을 요청을 하면, 동기 호출과 다르게 클라이언트는 "대기"하지 않는다. 다른 일을 하고 있거나 또다른 요청을 받아서 서버에 넘기고, 서버에서 A 작업이 완료되었을 경우, 이 A 작업을 받아서 해당 작업을 진행한다.
비동기 주요사례
참고사이트
동기와 비동기, 그리고 블럭과 넌블럭
Synchronous(동기) Vs Asynchronous(비동기)
자바스크립트 비동기처리
Javascript의 런타임
Web APIs
MDN - WebAPI
사용가능한 다양한 WebAPI 목록 in MDN
WebAPI-w3schools
WebAPI
Event Loop의 역할
참조사이트
MDN - Concurrency model and the event loop
Event Loop
JavaScript Event Loop and Asnyc api
// A,B,C 랜덤출력(순차출력x)
function pStr(str){
setTimeout(()=>{
console.log(str);
}, Math.floor(Math.random() * 100) + 1);
}
let printAll = () => {
pStr("A")
pStr("B")
pStr("C")
}
callback
이라고 한다.// A,B,C 순차적 출력
function pStr(str, callback){
setTimeout(()=>{
console.log(str)
callback()
}, Math.floor(Math.random() * 100) + 1);
}
let printAll = () => {
pStr("A", ()=>{
pStr("B", ()=>{
pStr("C", ()=>{})
})
})
}
callback 함수 구현 시, 앞 전달인자는 'Error', 뒤 전달인자는 '실 데이터값'의 형식으로 많이 보게 될 것이다.(하단 코드 참조)
const someFunc(callback){
someHappens()
if (err){
callback(err, null)
}
else{
callback(null, something)
}
}
new Promise((resolve, reject) => { ... })
const myFirstPromise = new Promise((resolve, reject) => {
// do something asynchronous which eventually calls either:
//
// resolve(someValue) // fulfilled
// or
// reject("failure reason") // rejected
});
참조사이트
자바스크립트 프라미스: 소개
then과 catch
function pStr(str){
return new Promise((resolve, reject) =>{
setTimeout(()=>{
console.log(str)
resolve()
},
Math.floor(Math.random() * 100) + 1
)
})
}
let printAll = () => {
pStr("A")
.then(() => {
return pStr("B")
})
.then(() => {
return pStr("C")
})
}
let promise = Promise.all([...promises...]);
Promise.all([
new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1
new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2
new Promise(resolve => setTimeout(() => resolve(3), 1000)) // 3
]).then(values => console.log(values));
// [1, 2, 3]
async
함수 안에 await
사용가능await
는 항상 async
와 함께 써줘야 작동한다.function pStr(str){
return new Promise((resolve, reject) =>{
setTimeout(()=>{
console.log(str)
resolve()
},
Math.floor(Math.random() * 100) + 1
)
})
}
let printAll = async () => {
const one = await pStr('A');
const two = await pStr('B');
const three = await pStr('C');
}
printAll(); //실행시, A,B,C가 순차적으로 실행된다.
// error와 함께 사용할 경우, 하단과 같이 구현한다.
async function someFunc(){
try{
let 변수1 = await 함수1()
.
.
dosomething
.
.
}catch{
.
error
.
}
}
참조사이트
자바스크립트 비동기 처리와 콜백 함수
[javascript] async, await를 사용하여 비동기 javascript를 동기식으로 만들자