약속을 여러 번 해결하는 것이 안전합니까?
내 응용 프로그램에 다음 코드가 포함 된 i18n 서비스가 있습니다.
var i18nService = function() {
this.ensureLocaleIsLoaded = function() {
if( !this.existingPromise ) {
this.existingPromise = $q.defer();
var deferred = this.existingPromise;
var userLanguage = $( "body" ).data( "language" );
this.userLanguage = userLanguage;
console.log( "Loading locale '" + userLanguage + "' from server..." );
$http( { method:"get", url:"/i18n/" + userLanguage, cache:true } ).success( function( translations ) {
$rootScope.i18n = translations;
deferred.resolve( $rootScope.i18n );
} );
}
if( $rootScope.i18n ) {
this.existingPromise.resolve( $rootScope.i18n );
}
return this.existingPromise.promise;
};
아이디어는 사용자가 전화를 걸어 ensureLocaleIsLoaded
약속이 해결 될 때까지 기다릴 것이라는 것 입니다. 그러나 함수의 목적이 로케일이로드 되었는지 확인 하는 것이므로 사용자가 여러 번 호출하는 것이 완벽합니다.
저는 현재 단일 promise를 저장하고 서버에서 로케일이 성공적으로 검색된 후 사용자가 함수를 다시 호출하면 해결합니다.
내가 알 수 있듯이 이것은 의도 한대로 작동하지만 이것이 적절한 접근 방식인지 궁금합니다.
현재 약속을 이해하고 있으므로 100 % 괜찮습니다. 이해해야 할 점은 일단 해결 (또는 거부)되면 지연된 객체에 대한 것입니다.
then(...)
약속을 다시 요청해야한다면 즉시 (첫 번째) 해결 / 거부 결과를 받아야합니다.
에 대한 추가 호출은 효과 resolve()
가 없습니다 (안돼야합니까?). reject
이전에 지연된 개체를 시도하면 어떻게되는지 확실하지 않습니다 resolved
(아무것도 의심하지 않습니다).
나는 얼마 전에 똑같은 일에 직면했습니다. 실제로 약속은 한 번만 해결 될 수 있으며 다른 시도는 아무 일도하지 않습니다 (오류 없음, 경고 없음, then
호출 없음 ).
다음과 같이 해결하기로 결정했습니다.
getUsers(users => showThem(users));
getUsers(callback){
callback(getCachedUsers())
api.getUsers().then(users => callback(users))
}
함수를 콜백으로 전달하고 원하는만큼 호출하면됩니다! 이해가 되길 바랍니다.
당신이해야 할 일은 메인 ng-outlet에 ng-if를 넣고 대신 로딩 스피너를 보여주는 것입니다. 로케일이로드되면 출력이 표시되고 구성 요소 계층이 렌더링됩니다. 이렇게하면 모든 애플리케이션에서 로케일이로드되고 확인이 필요하지 않다고 가정 할 수 있습니다.
promise의 반환 값을 변경해야하는 경우 새 값을 반환 then
하고 다음 then
/ 연결 catch
하면됩니다.
var p1 = new Promise((resolve, reject) => { resolve(1) });
var p2 = p1.then(v => {
console.log("First then, value is", v);
return 2;
});
p2.then(v => {
console.log("Second then, value is", v);
});
참고 URL : https://stackoverflow.com/questions/20328073/is-it-safe-to-resolve-a-promise-multiple-times
'Programing' 카테고리의 다른 글
WCF 대 ASP .Net 웹 API (0) | 2020.08.31 |
---|---|
ContentType과 MimeType의 차이점은 무엇입니까 (0) | 2020.08.31 |
JavaScript에서 집합을 매핑 / 축소 / 필터링하는 방법은 무엇입니까? (0) | 2020.08.31 |
정규식의 일부만 대소 문자를 구분하지 않게 만들 수 있습니까? (0) | 2020.08.31 |
Go 컴파일러를 Windows에 설치할 수 있습니까? (0) | 2020.08.31 |