본문 바로가기
카테고리 없음

AngularJS - promise-$q

by ByteBridge 2016. 2. 23.
반응형
서버 요청 작업은 비동기 작업이다.
따라서 응답이 오는 시점을 보장 할 수 없다.
응답시점을 알지 못할 경우 , 코드를 순서대로 실행 할수있는 방법은?

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 활용)






반응형