2016-09-23 4 views
0

약속 개체를 해결할 것과 같은 방식으로 Angular의 defer.resolve를 Javascript Promise 개체와 함께 사용합니다. 다른 식으로 말하면 : 더미 약속 객체를 생성하여 반환하려고합니다. 이 약속은 나중에 해결 될 것입니다.지연 약속/연기 약속 해결

각도에서

내가 이런 식으로 작성합니다

... 
$scope.checkThis = { test: false }; 

function getPromise() { 
    var deferred = $q.defer(); 
    var data = [1, 2, 3]; 

    function resolvePromise() { 
     deferred.resolve(data); 
    } 

    $scope.$watch("checkThis.test", function(newVal, oldVal) { 
     if (newVal) { 
      resolvePromise(); 
     } 
    }); 

    return deferred.promise; 
} 

$scope.getData1 = function() { 
    return getPromise(); 
}; 

$scope.getData2 = function() { 
    return getPromise(); 
}; 

... 

가 어떻게 일반 자바 스크립트 약속 개체와 동일한 달성 할 것입니까? 몇 가지 해결 방아쇠를 유발할 이벤트 ($ scope.checkThis.test가 true가 됨)가 있기 때문에 Promise 생성자를 사용하는 방법을 알지 못합니다.

+0

"* 여러 가지 해결 방안을 유발할 이벤트 *"란 무엇을 의미합니까? 왜 그것이 연기 생성자가 아닌 지연을 위해 작동합니까? – Bergi

답변

3

표준 약속은 revealing constructor pattern을 사용합니다. 조심

function getPromise() { 
    return new Promise(resolve => { 
    var data = [1, 2, 3]; 
    $scope.$watch("checkThis.test", function(newVal, oldVal) { 
     if (newVal) { 
     resolve(data); 
     } 
    }); 
    }); 
} 

: 그것을 할 수있는 간단하고 선호하는 방법이있다! 표준 약속이 앵귤러 다이제스트 루프를 트리거하지 않으며, 약속 콜백 내의 범위에 대한 변경 사항이 UI 및와 쳐에 즉시 반영되지 않을 수 있습니다. 이것은 $q을 표준 Promise으로 변경할 수없는 이유입니다.

시나리오에 드러내는 생성자 패턴을 적용 할 수없는 경우 다음과 비슷한 지연 클래스를 만드는 방법이 있습니다. 항상이 클래스을 사용하는 것을 피할 수 있습니다. 방문자가 기존 코드를 재구성 할 필요없이 이전 약속 라이브러리에서 변경하는 방법을 볼 수 있도록 방금두고 있습니다. 새로운 코드는 다음과 같이 사용해야합니다 :

class Deferred { 
    constructor() { 
    this.resolve = null; 
    this.reject = null; 
    this.promise = null; 

    this.promise = new Promise((resolve, reject) => { 
     this.resolve = resolve; 
     this.reject = reject; 
    }); 
    } 
} 
+1

음,이'Deferred' 클래스는 드러내는 생성자 패턴에있는 모든 장점을 몰살시킵니다. 그것을 사용하지 마십시오! – Bergi

+0

올바르게 이해하면 보류중인 약속을 반환하는 Promise 팩토리가 생성됩니다. 내 경우 엔 효과가있다. 고맙습니다. @ 베기 : 왜 그것을 사용하지? – casenonsensitive

+0

@Bergi 완전히 맞습니다. 나는 분산 시스템이 관련된 시나리오에서만 이것을 사용하고, 메시지 기반 프로토콜은 콜 응답 기반 프로토콜로 변환되어야한다. 이 경우, 대기중인 모든 요청 (예 : 지연)을 맵에 저장하고 적절한 응답에서 검색하고 해결하는 유일한 방법이 있습니다. –

관련 문제