//Promise 선언
function asyncFunc(param) {
return new Promise(function(resolve, reject) {
setTimeout(function() { // 비동기 함수
param ? resolve("resolved!") : reject("rejected!");
}, 2000);
});
};
//Promise 실행
asyncFunc(true)
.then(function(data) {
// resolve가 실행된 경우(성공), resolve 함수에 전달된 값이 data에 저장
console.log(data);
},function(reason) {
// reject가 실행된 경우(실패), reject 함수에 전달된 값이 reason에 저장
console.log(reason);
throw "Error:" + reason;
}).catch(function(error) {
console.error(error);
});
jQuery Deferred는 비동기 처리에 사용되는 Promise 객체를 지원하는 jQuery의 기능 중 하나.
Deferred 객체 생성 및 상태 변화:
$.Deferred()를 사용하여 Deferred 객체를 생성.resolve() 또는 reject()를 호출하여 상태를 변경할 수 있음.pending(처리 중), resolved(처리 성공), rejected(처리 실패) 세 가지.Promise 객체 반환:
deferred.promise()을 사용하여 Deferred 객체가 가지고 있는 Promise 객체를 반환.resolve() 및 reject()를 사용할 수 없어 비동기 처리 상태를 고정.Chaining:
Callback 함수 등록:
done()(성공 콜백), fail()(실패 콜백), always()(항상 실행되는 콜백) 등을 등록할 수 있음.$.when()을 이용한 병렬 처리:
$.when()을 사용하여 복수의 Deferred 객체를 병렬로 처리할 수 있음.Ajax와의 연동:
이러한 jQuery Deferred를 활용하면 비동기 처리를 더 편리하게 다룰 수 있음.
// Deferred 객체 생성 및 Promise 반환
function sleep(ms) {
var dfd = $.Deferred();
setTimeout(function(){
dfd.resolve();
}, ms);
return dfd.promise();
}
// Chaining을 이용한 비동기 처리
console.log(0);
sleep(1000)
.then(function(){
console.log(1);
return sleep(1000);
})
.then(function(){
console.log(2);
});
// Callback 함수 등록
sleep(1000)
.done(function() {
console.log('resolved');
})
.fail(function() {
console.log('rejected');
})
.always(function() {
console.log('always');
});
// 병렬 처리 - $.when()을 이용
$.when(sleep(1000), sleep(1500))
.done(function() {
console.log('Both resolved');
})
.fail(function() {
console.log('At least one rejected');
});
// Ajax와의 연동 - Ajax 요청 후 성공, 실패, 완료 시에 콜백 함수 등록
var jqxhr = $.ajax("/example")
.done(function() {
console.log("Ajax success");
})
.fail(function() {
console.log("Ajax error");
})
.always(function() {
console.log("Ajax complete");
});
// Ajax 요청 완료 후 추가 콜백 등록
jqxhr.always(function() {
console.log("Second complete");
});