w3schools trabajar then sincronas promises promesas platzi funciones example con anidadas javascript angularjs

javascript - trabajar - ¿Es seguro resolver una promesa varias veces?



promises javascript w3schools (2)

Tengo un servicio i18n en mi aplicación que contiene el siguiente código:

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; };

La idea es que el usuario llame a ensureLocaleIsLoaded y espere a que se resuelva la promesa. Pero dado que el propósito de la función es asegurar solo que la configuración regional esté cargada, sería perfectamente correcto que el usuario la invoque varias veces.

Actualmente solo estoy almacenando una única promesa y la resuelvo si el usuario vuelve a llamar a la función una vez que la configuración regional se ha recuperado correctamente del servidor.

Por lo que puedo decir, esto funciona según lo previsto, pero me pregunto si este es un enfoque adecuado.


Como entiendo las promesas en este momento, esto debería ser 100% correcto. Lo único que hay que entender es que una vez resuelto (o rechazado), se trata de un objeto desviado, ya está hecho.

Si debe llamar then(...) a su promesa nuevamente, debe obtener inmediatamente el (primer) resultado resuelto / rechazado.

Las llamadas adicionales a resolve() no tendrán (¿no debería?) Ningún efecto. No estoy seguro de qué sucede si intenta reject un objeto desviado que se resolved previamente (no sospecho nada).