반응형
서버 요청 작업은 비동기 작업이다.
따라서 응답이 오는 시점을 보장 할 수 없다.
응답시점을 알지 못할 경우 , 코드를 순서대로 실행 할수있는 방법은?
promise (프라미스) 란 ?
서버에 요청을 하고 response 가 올때까지 다른 job 을 수행 할 수있고, response 가 왔을때 다시 원래 작업을 돌아 올수 있도록 하는 도구이다.
활용 방식:
$q 서비스 객체를 이용하여 (defer()) 자신이 원하는 작업을 지정할 수있는 객체를 생성
defer() 로 생성된 객체의 기능:
notify: 현재 상태의 변경을 통지하는 기능
resolve: 성공적인 결과의 전달
reject: 실패 결과의 전달
개발자의 작업 순서:
1. $q.defer() 를 이용하여 resolve() 하거나, reject() 할 수있는 객체를 준비
2. 원하는 작업을 실행해서 $q.defer() 로 생성된 객체에 resolve하거나 reject()
3. 작업의 종료 시에는 defer() 의 속성인 promise 객체를 반환
4. 넘겨진 Promise 를 이용하는 곳에서는 then() 을 이용하여 처리
예제
app=controller(“DataCtrl”,function($scope,$q,$http){
var gathering = function(){
var count=0;
var asyncJob=$q.defer();
$http.get(“data.json”).success(function (data){
console.log(“first job finished..”);
asyncJob.notify(‘first job’);
asyncJob.resolve(data);
});
return asyncJob.promise;
}
$q.all() 을 이용하여 다중 promise 를 처리 할 수있다.
여러개의 비동기화된 작업의 처리 결과를 한번에 묶어서 처리 가능.
ex: 특정 데이터가 두 곳의 데이터를 같이 모아서 전달되어야 할 경우 유용함.
파라미터는 배열의 형태로 여러개의 promise 작업이 들어 갈수있음.
이 외에도 chaning 과 when 을 이용하는 방식이 있다.
체이닝 방식: then() 뒤에 다시 promise 를 연결 하는 방식.
$q.when(): 처리 결과에 또다른 것을 붙여야 할 경우 래핑하고 추가적인 데이터를 붙인다.
(출처: 자바스크립트 이해와 AngularJS 활용)
반응형