Category : Javascript
function isPositivePromise(number) {
const excutor = (resolve, reject) => {
setTimeout(() => {
if (typeof number === 'number') {
resolve(number >= 0 ? '양수' : '음수');
} else {
reject('주어진 값이 숫자가 아닙니다.');
}
}, 2000);
};
const asyncTask = new Promise(excutor);
return asyncTask;
}
const result = isPositivePromise(10);
result.then((res) => {
// resolve
console.log('작업 성공 : ', res);
}).catch((err) => {
// reject
console.log('작업 실패 : ', err);
});
위에서 처리한 코드와 다르게 중간에 있는(isPositivePromise())는 Promise 객체를 반환하고 result.then().catch()를 이용해 결과를 처리한다.
Promise.then()은 Fullfilled(이행)된 상태를 처리하는 부분이고 Promise.catch()는 Rejected(실패)된 상태를 처리하는 부분이다. Error handling시 catch()를 사용하는 것을 추천한다.
(다만 Async, Await이 생긴 후로는 사용하지 않는 추세이다.)
function A(a) {
return new Promise((resolve, reject) => {
setTimeout(() => {
const resA = a + 2;
resolve(resA);
}, 3000);
});
}
function B(a) {
return new Promise((resolve, reject) => {
setTimeout(() => {
const resB = a * 3;
resolve(resB);
}, 2000);
});
}
function C(a) {
return new Promise((resolve, reject) => {
setTimeout(() => {
const resC = a * -1;
resolve(resC);
}, 1000);
});
}
// 결과를 resultB에 저장하고
const resultB = A(2).then((resA) => {
console.log('A result : ', resA);
return B(resA);
});
// somthing another code //
// 다른 작업을 처리한 후 불러와서 사용할 수 있다.
resultB.then((resB) => {
console.log('B result : ', resB);
return C(resB);
}).then((resC) => {
console.log('C result : ', resC);
});
Category : Javascript
function A(a, cb) {
setTimeout(() => {
const resA = a + 2;
cb(resA);
}, 3000);
}
function B(b, cb) {
setTimeout(() => {
const resB = b * 3;
cb(resB);
}, 2000);
}
function C(c, cb) {
setTimeout(() => {
const resC = c * -1;
cb(resC);
}, 1000);
}
A(2, (resA) => console.log('A result : ', resA)); // (1)
B(2, (resB) => console.log('B result : ', resB));
C(2, (resC) => console.log('C result : ', resC));
console.log('end!');
/* end!
C result : -2
B result : 6
A result : 4 */
위에서 확인할 수 있는 것처럼 함수의 호출은 A → B → C → *console.log()*순으로 했지만, *setTimeout()*으로 인해 결과는 console.log() → C → B → A순으로 진행되었음을 알 수 있다. 이것은 Javascript의 비동기처리 때문에 일어나는 일이다.
Javascript의 비동기 처리 방식은 다음과 같다. 우선 A()하나만 가지고 살펴보자.
console.log(’end!’);
가 실행된다....
A(2, (resA) => {
console.log('A result : ', resA);
B(2, (resB) => {
console.log('B result : ', resB);
C(2, (resC) => {
console.log('C result : ', resC);
});
});
});
console.log('end!');
/* end!
A result : 4
B result : 6
C result : -2 */
위 쪽 코드의 실행 부분을 A → B → C 순으로 동기 실행되게 수정한 코드이다. 이처럼 콜백함수를 이용하면 비동기 처리 방식을 동기 처리로 바꿀 수 있다.
이는 api데이터를 불러올 때 등 반드시 이전 실행 결과를 기다려야할 때 사용하면 된다.
비동기 처리 너무 어려운 데 중요한 개념이라 계속 접하면서 공부해야할 것 같다.