AngularJS 의 Promise --- $q 서비스 상세 설명

3514 단어
Promise 가 뭐야?
Javascript 에서 비동기 적 인 실현 방식 은 매우 많 습 니 다. 지연 함수, 리 셋 함수, 그리고 es6 에 추 가 된 생 성기 함수 입 니 다. 그 중에서 Promise 도 비동기 적 인 방식 중 하나 입 니 다.javascript 의 비동기 실현 방식 에 대한 상세 한 해석 과 차이 점 은 후기 에 블 로 그 를 업데이트 할 것 이 니 기대 하 십시오. 여기 서 더 이상 군말 하지 않 겠 습 니 다.
$q 서비스
간단히 말 하면 $q 서 비 스 는 AngularJS 에서 자체 패키지 로 이 루어 진 Promise 입 니 다.먼저 $q 가 자주 사용 하 는 몇 가지 방법 을 소개 합 니 다:
  • defer () 는 deferred 대상 을 만 듭 니 다. 이 대상 은 resolve, reject, notify 등 몇 가지 일반적인 방법 을 실행 할 수 있 습 니 다.
  • all () Promise 의 배열 에 들 어가 대량으로 실행 하고 promise 대상
  • 을 되 돌려 줍 니 다.
  • when () 에 불확실 한 인자 가 들 어 오고 Promise 기준 에 부합 하면 promise 대상 을 되 돌려 줍 니 다.
  •        Promise ,       :    ,    ,    。
             :
    1.          
    2.              
    

    defer () 방법
    $q 에서 resolve 방법 을 사용 하여 완료 상태 가 될 수 있 습 니 다.reject 방법 을 사용 하여 거부 상태 가 됩 니 다.그 중에서 defer () 는 deferred 대상 을 만 드 는 데 사 용 됩 니 다. defer. promise 는 promise 대상 을 되 돌려 then 방법 을 정의 하 는 데 사 용 됩 니 다.then 에는 성공 리 셋, 실패 리 셋, 상태 변경 리 셋 등 세 개의 인자 가 있 습 니 다.다음은 한 회사 프로젝트 가 만난 실례 를 보 겠 습 니 다.
    'use strict';
    
    angular.module('app')
        .controller('positionCtrl',['$scope','$state','$q','$stateParams','$http',function ($scope,$state,$q,$stateParams,$http) {
            var vm = this;
            vm.position;
            vm.company;
            vm.isLogin = false;
            function getPosition() {
                var def = $q.defer();
                $http.get('/data/position.json?id = ' + $stateParams.id)
                    .then(function (resp) {
                        vm.position = resp.data;
                        // console.log(resp.data);
                        // console.log(vm.position);
                        def.resolve(resp);
                    }).catch(function () {
                    def.reject(err);
                });
                return def.promise;
            };
            function getCompany(id) {
                $http.get('data/company.json?id='+id)
                    .then(function (resp) {
                        vm.company = resp.data;
                        // console.log(vm.company);
                    })
                    .catch(function (err) {
                        console.log(err);
                });
            };
            getPosition().then(function (obj) {
                getCompany(obj.companyId);
            });
        }]);
    

    상기 코드 업무 논 리 는 매우 간단 하 다. 먼저 회사 직위 vm. position 을 얻 고 직무 정보 중의 copanyId 에 따라 회사 vm. copany 를 얻 어야 한다.첫 번 째 함수 에서 getPosition 에서 먼저 $q. defer () 방법 을 호출 하여 deferred 대상 을 얻 습 니 다.return def.promise;문 구 는 분명히 함수 getPosition 을 Promise 대상 으로 되 돌려 줍 니 다. 그러면 getPosition () 함 수 를 호출 한 후에 'then () 방법' 을 직접 사용 할 수 있 습 니 다.
     getPosition().then(function (obj) {
                getCompany(obj.companyId);
            });
    

    이렇게 해서 두 함수 의 동기 집행 을 비동기 집행 으로 바 꾸 었 다.
    all () 방법
    이 all () 방법 은 여러 primise 의 배열 을 하나 로 합 칠 수 있 습 니 다.모든 promise 가 성공 하면 뒤의 리 셋 을 실행 합 니 다.리 셋 의 인 자 는 모든 promise 가 실 행 된 결과 입 니 다.어떤 방법 을 대량으로 실행 할 때 이 방법 을 사용 할 수 있다.
     var funcA = function(){
                    var def = $q.defer();
                    console.log("funcA");
                    //some code
                    return def.promise;
                }
    var funcB = function(){
                    var def = $q.defer();
                    console.log("funcA");
                    //some code
                    return def.promise;
                }
    $q.all([funcA(),funcB()])
                .then(function(result){
                    console.log(result);
                });
    

    좋은 웹페이지 즐겨찾기