나는 에뮬레이트해야한다 '. $ Promise'객체?
-
20-12-2019 - |
문제
Angularjs를 사용하여 관리 앱에서 일하고 있습니다. 앱은 $ 자원을 사용하여 서버에서 데이터를 가져옵니다. 데이터가 가져 오는시기를 결정하기 위해 '$ PROMISE'속성이 포함 된 데이터 객체로 끝납니다. 모든 것이 괜찮아요.
이제이 관리 앱은 새 개체를 만들 수도 있습니다. 이러한 새 개체는 일반적으로 '$ RESOURCE'에서 제공되는 것보다 동일한 컨트롤러에 의해 관리됩니다.
이제는 2 종류의 물체가 있습니다.
- $ Promise 속성이있는 객체. 전체 데이터로 조작하기 전에 $ Promise.then ()을 사용해야합니다.
- 일반 물체. 그들은 $ PROMISE 속성이 없으며, 그 값은 즉시 에 액세스 할 수 있습니다
코드를 줄이고 단일 유스 케이스가 있고, 오브젝트 데이터가 해결되었는지, 또는 약속이 아닌 경우를 확인하지 않아도됩니다.
가 자신에게 이미 해결 된 '$ PROMISE'속성을 추가하여 '평범한'물체를 구축하는 데 문제가 있습니까? 그런 식으로, 나는 항상 'myObject, $ promise.then ()'를 사용합니다.
이 상황을 처리하는 일반적인 패턴이 있습니까? 나는 이런 종류의 객체를 각도로 만들기 위해 '표준'방법을 찾을 수 없었다.
해결책
$ q. / 객체에는 약속이 있거나 아닙니다.
(obj.$promise ? obj.$promise || $q.when(objResult)).then(function(result){
//handle success case.
//Incase of object not having the $promise property result will be object itself
})
.
결과 속성이 약속이 없으면 이것이 약속으로 해결 될 것입니다.
가치 또는 (제 3 자) 일 수있는 객체를 $ Q 약속에 대한 약속을줍니다. 이것은 약속 일 수도 있고 아닐 수도 있고, 약속이 신뢰할 수없는 소스에서 유래 된 경우 유용합니다.
항상 약속을 만들고 전송되는 데이터에 첨부 할 필요가 없습니다. 예 : -
function getCurrentUserData(userId){
var defered = $q.defer();
...
//Check in my cache if this is already there, then get it from cache and resolve it
defered.resolve(objectFromCache);
//my else condition
//It is not in cache so let me make the call.
$http.get('myurl').then(function(result){
//Do validation with data and if it doesnot match then reject it
defered.reject(reason);
//Else Do something with the data put it into the cache, mapping logic etc..
defered.resolve(dto);
}).catch(function(error){
//do something with error and then reject
defered.reject(reasonDerived);
});
return defered.promise;
}
.
여기에 간단하고 덜 명백한 버전이 있습니다 (크레딧 : Benjamin Gruenbaum) :
var cached = null;
function getCurrentUserData(userId){
return cached = cached || $http.get('myurl').then(function(result){
if(isNotValid(result)) return $q.reject(reason); // alternatively `throw`
return transformToDto(result);
}, function(response){
if(checkforsomethingonstatusandreject)
return $q.reject('Errored Out')
//do some actions to notify the error scenarios and return default actions
return someDefaults; });
}
.
물론 return $q.reject(derivedReason)
는 그 이유를 반환하는 것이 아니라 추가 수표를 기반으로 변환하는 것이 아니라, 아이디어는 가치가 아닌 약속을 캐싱하고 있습니다. 이는 메소드가 한 번 반환하기 전에 호출되면 여러 HTTP 요청을하지 않는 이점이 있습니다.
이제는 항상 할 수 있습니다 : -
getCurrentUserData(userid).then(function(user){
}).catch(function(error){
});
.
약속은 또한 체인 될 수 있습니다. 그래서 당신은 또한 이것을 할 수 있습니다 : -
return $resource('myresource').$promise.then(function(result){
//Do some mapping and return mapped data
return mappedResult;
});
. 다른 팁
A + 약속은 정적 방법을 제공해야합니다 :
Promise.resolve(val);
.
... 미리 해결 된 약속을 생성합니다.약속 도서관이이를 제공하는 경우이 중 하나를 반환해야합니다.큰.인터페이스 복제를 피하기 위해 자주 수행합니다.