약속을 반환하는 함수를 작성하려고합니다. 그러나 요청 된 정보를 즉시 사용할 수있는 경우가 있습니다. 소비자가 결정을 내릴 필요가 없도록 약속으로 포장하고 싶습니다.
function getSomething(id) {
if (Cache[id]) {
var deferred = $q.defer();
deferred.resolve(Cache[id]); // <-- Can I do this?
return deferred.promise;
} else {
return $http.get('/someUrl', {id:id});
}
}
다음과 같이 사용하십시오.
somethingService.getSomething(5).then(function(thing) {
alert(thing);
});
문제는 콜백이 미리 해결 된 약속에 대해 실행되지 않는다는 것입니다. 이것이 합법적 인 일입니까? 이 상황을 처리하는 더 좋은 방법이 있습니까?
Crud. 내 인생의 한 시간을 잃었습니다. 나는 이것을 단위 테스트에서 시도하고 있었고 테스트가 완료된 후에 약속이 성취되었지만 나는 그것을 보지 못했습니다. 코드가 아닌 내 테스트에 문제가 있습니다.
—
Craig Celeste
$ scope. $ apply ()를 호출하여 테스트 중에 문제가 즉시 해결되는지 확인하십시오.
—
dtabuenc
나는 httpbackend.flush가 이것을 고려한다고 생각하지만 $ q는 그렇지 않을 수도 있습니다. 이 테스트에서는 범위를 사용하지 않습니다. 서비스를 직접 테스트하고 있지만 어쨌든 작동하게되었습니다. 감사합니다.
—
Craig Celeste
return $q.when(Cache[id])
. 어쨌든 이것은 매번 새로운 약속을 생성하기 때문에 매번 작동하고 콜백을 호출해야합니다.