多次解决承诺是否安全?

我在我的应用程序中有一个国际化的服务,其中包含以下代码:

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并等待承诺解决。 但是考虑到函数的目的只是为了确保语言环境被加载,用户可以多次调用它。

我目前只是存储一个单一的承诺,并解决它,如果用户从服务器成功检索区域设置后再次调用该function。

据我所知,这是按预期工作,但我想知道这是否是一个适当的方法。

据我了解目前的承诺,这应该是100%的罚款。 唯一要理解的是,一旦解决(或拒绝),那就是一个被攻击的对象 – 已经完成了。

如果你then(...)打电话给then(...)再次承诺,你应该立即得到(第一)解决/拒绝的结果。

resolve()其他调用不会(不应该)有任何影响。 不知道如果你试图reject先前已resolved被攻击对象会发生什么情况(我什么都不怀疑)。

如果你想多次parsing被caching的对象,我build议使用“DeferredWithUpdate.js”

你可以在这里findgithub项目:

bennadel/DeferredWithUpdate.html