Promise
, ES2017에서는 async
/await
라고 볼 수 있습니다.pending
(대기) / fulfilled
(성공) / rejected
(실패), 성공/실패 여부에 따라 Promise
객체가 fulfilled
나 rejected
각각의 정보를 갖게 됩니다.Promise
의 인자로 넘겨주는 콜백 함수는 호출할 때 바로 실행되지만 그 내부에 resolve
나 reject
함수를 호출하는 구문이 있을 경우 둘 중 하나가 실행되기 전까지는 다음(then
) 또는 오류 구문(catch
)으로 넘어가지 않습니다. (pending
상태)Promise
객체는 콜백 함수의 인자로 resolve
와 reject
를 가질 수 있는데, 콜백 함수의 인자로 resolve
가 실행되면 fullfilled
상태가 되어 then
구문 안쪽의 프로세스로 넘어 가는 반면, reject
가 실행되면 rejected
상태가 되어 catch
안쪽의 프로세스를 실행합니다.function A(callback) {
console.log('A');
setTimeout(() => callback(), 0);
}
function B() {
console.log('B');
}
function C() {
console.log('C');
}
A(B);
C();
generator
를 이용해 비동기 처리 방식으로 접근할 수 있었습니다.generator
함수를 작성하기 위한 규칙, function 키워드 뒤나 식별자 앞에 선언Iterator
: generator
호출로 반환된 객체, next()
를 가지고 있음next()
: generator
함수 안에 yield
문으로 넘어가기 위한 메소드yield
: next()
가 호출되었을 때 1) 중간에 멈추고 2) 데이터를 받는 지점fuction *asyncTask() {
const data = yield request();
// 받아온 data를 이용한 일련의 작업 수행 영역
}
function request() {
ajax('url', function (data) {
it.next(data);
});
}
const it = asyncTask();
it.next();
generator
함수를 호출해 iterator
객체를 반환 → 이 객체에 next()
메소드를 호출generator
함수를 수행하다가 첫 번째 yield
문 뒤에 함수를 호출하고 함수를 중단 → 비동기 요청을 통해 값을 받아오면 받아온 값을 중단된 지점으로 보내서 다시 함수 진행await
문을 만나면 함수의 실행을 일시 중지await
뒤에 있는 Promise()
의 수행한 값을 받아서 함수를 재진행async function asyncTask() {
const data = await request();
// 받아온 data를 이용한 일련의 작업 수행 영역
}
function request() {
return new Promise(resolve => {
ajax('url', function (data) {
resolve(data);
});
});
}
Promise
에 대한 Syntactic Sugar이기 때문에 Promise
에 대한 선행적 이해가 필요합니다.Promise
로 자동 전환하고, 해당 내용이 resolve된 이후에야 다음으로 진행합니다. Promise
문법을 사용하면서도 단순 Promise
chaining보다 가독성이 뛰어나고 작성법도 간단하다고 볼 수 있습니다.