Skip to content
This repository has been archived by the owner on Jan 29, 2024. It is now read-only.

Commit

Permalink
fix(service): fix missing promise rejection handlers
Browse files Browse the repository at this point in the history
Credits for a GREAT debugging help via angular-ui/ui-router#2889 (comment)

Relates #1657
  • Loading branch information
knalli committed Feb 6, 2017
1 parent f4dc14a commit 776993b
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 4 deletions.
5 changes: 3 additions & 2 deletions src/service/translate.js
Original file line number Diff line number Diff line change
Expand Up @@ -1152,7 +1152,8 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide
};
promiseResolved.displayName = 'promiseResolved';

promiseToWaitFor['finally'](promiseResolved);
promiseToWaitFor['finally'](promiseResolved)
.catch(angular.noop); // we don't care about errors here, already handled
}
return deferred.promise;
};
Expand Down Expand Up @@ -1901,7 +1902,7 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide
});
langPromises[key]['finally'](function () {
clearNextLangAndPromise(key);
});
}).catch(angular.noop); // we don't care about errors (clearing)
} else if (langPromises[key]) {
// we are already loading this asynchronously
// resolve our new deferred when the old langPromise is resolved
Expand Down
72 changes: 70 additions & 2 deletions test/unit/service/translate.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,41 @@

describe('pascalprecht.translate', function () {

// https://github.com/angular-ui/ui-router/issues/2889#issuecomment-273944742
var enableUnhandledRejectionTracing = function (module) {

if (angular.version.minor < 3) {
// will work w/ AngularJS 1.3+
return;
}

/* jshint ignore:start */
// Decorate the $q service when app starts
module.decorator('$q', ["$delegate", function ($delegate) {
// Create a new promise object
var promise = $delegate.when();

// Access the `Promise` prototype (nonstandard, but works in Chrome)
var proto = promise.__proto__;

// Define a setter for `$$state` that creates a stacktrace
// (string) and assigns it as a property of the internal `$$state` object.
Object.defineProperty(proto, '$$state', {
enumerable : true,
set : function (val) {
val.stack = new Error().stack;
this._$$state = val;
},
get : function () {
return this._$$state;
}
});

return $delegate;
}]);
/* jshint ignore:end */
};

beforeEach(module('ngMockE2EAsync'));

var translationMock = {
Expand Down Expand Up @@ -622,6 +657,8 @@ describe('pascalprecht.translate', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {

enableUnhandledRejectionTracing($provide);

$translateProvider.useLoader('customLoader');

$translateProvider.preferredLanguage(slowButRequestedFirst);
Expand Down Expand Up @@ -715,6 +752,8 @@ describe('pascalprecht.translate', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {

enableUnhandledRejectionTracing($provide);

$translateProvider.useLoader('customLoader');

$translateProvider.preferredLanguage(requestedFirst);
Expand Down Expand Up @@ -808,6 +847,8 @@ describe('pascalprecht.translate', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {

enableUnhandledRejectionTracing($provide);

$translateProvider.useStaticFilesLoader({
prefix: 'foo/bar/',
suffix: '.json'
Expand Down Expand Up @@ -897,6 +938,8 @@ describe('pascalprecht.translate', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {

enableUnhandledRejectionTracing($provide);

$translateProvider.useLoader('customLoader');

$translateProvider.preferredLanguage(slowButRequestedFirst);
Expand Down Expand Up @@ -968,7 +1011,8 @@ describe('pascalprecht.translate', function () {

var $translate, $httpBackend, $timeout;

beforeEach(module('pascalprecht.translate', function ($translateProvider) {
beforeEach(module('pascalprecht.translate', function ($provide, $translateProvider) {
enableUnhandledRejectionTracing($provide);
$translateProvider.useStaticFilesLoader({
prefix : 'lang_',
suffix : '.json'
Expand Down Expand Up @@ -1258,6 +1302,9 @@ describe('pascalprecht.translate', function () {
describe('translate returns handler result', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {

enableUnhandledRejectionTracing($provide);

$translateProvider
.translations('de_DE', translationMock)
.preferredLanguage('de_DE');
Expand Down Expand Up @@ -1288,6 +1335,7 @@ describe('pascalprecht.translate', function () {
describe('multi fallback language', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {
enableUnhandledRejectionTracing($provide);
$translateProvider
.translations('de_DE', translationMock)
.translations('en_EN', { 'TRANSLATION__ID': 'bazinga' })
Expand Down Expand Up @@ -1406,6 +1454,7 @@ describe('pascalprecht.translate', function () {
describe('registered loader', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {
enableUnhandledRejectionTracing($provide);
$translateProvider
.useLoader('customLoader')
.preferredLanguage('en_EN')
Expand Down Expand Up @@ -1465,7 +1514,7 @@ describe('pascalprecht.translate', function () {
fallbackLanguageResponded = false;

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {

enableUnhandledRejectionTracing($provide);
$translateProvider.useStaticFilesLoader({
prefix: 'foo/bar/',
suffix: '.json'
Expand Down Expand Up @@ -1631,6 +1680,7 @@ describe('pascalprecht.translate', function () {
describe('$translateProvider#useLoader', function () {

beforeEach(module('pascalprecht.translate', function($translateProvider, $provide) {
enableUnhandledRejectionTracing($provide);
$translateProvider
.useLoader('customLoader')
.preferredLanguage('en');
Expand Down Expand Up @@ -1765,6 +1815,8 @@ describe('pascalprecht.translate', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {

enableUnhandledRejectionTracing($provide);

$provide.factory('customInterpolation', function () {

var translateInterpolator = {},
Expand Down Expand Up @@ -1868,6 +1920,8 @@ describe('pascalprecht.translate', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {

enableUnhandledRejectionTracing($provide);

$provide.factory('customLoader', function ($q, $timeout) {
return function (options) {
var deferred = $q.defer();
Expand Down Expand Up @@ -1918,6 +1972,7 @@ describe('pascalprecht.translate', function () {
var missingTranslations = {};

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {
enableUnhandledRejectionTracing($provide);
$translateProvider
.translations('en', translationMock)
.preferredLanguage('en')
Expand Down Expand Up @@ -2027,6 +2082,7 @@ describe('pascalprecht.translate', function () {
describe('loader registered', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {
enableUnhandledRejectionTracing($provide);
$translateProvider
.translations('de_DE', translationMock)
.translations('en_EN', translationMock)
Expand Down Expand Up @@ -2144,6 +2200,7 @@ describe('pascalprecht.translate', function () {

describe('loader registered:', function () {
beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {
enableUnhandledRejectionTracing($provide);
$translateProvider
.preferredLanguage('en_EN')
.useLoader('customLoader');
Expand Down Expand Up @@ -2262,6 +2319,7 @@ describe('pascalprecht.translate', function () {
describe('$translate.instant (with fallback)', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {
enableUnhandledRejectionTracing($provide);
$translateProvider
.useLoader('customLoader')
.translations('en', {
Expand Down Expand Up @@ -2346,6 +2404,7 @@ describe('pascalprecht.translate', function () {
describe('$translate.instant (with fallback and not found indicators)', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {
enableUnhandledRejectionTracing($provide);
$translateProvider
.useLoader('customLoader')
.translations('en', {
Expand Down Expand Up @@ -2392,6 +2451,7 @@ describe('pascalprecht.translate', function () {
var missingTranslations = {};

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {
enableUnhandledRejectionTracing($provide);
$translateProvider
.translations('en', {
'NAMESPACE1':
Expand Down Expand Up @@ -2475,6 +2535,7 @@ describe('pascalprecht.translate', function () {

describe('Enabled', function () {
beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {
enableUnhandledRejectionTracing($provide);
$translateProvider
.translations('en', {
'FOO': 'bar'
Expand Down Expand Up @@ -2536,6 +2597,7 @@ describe('pascalprecht.translate', function () {

describe('Disabled (default)', function () {
beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {
enableUnhandledRejectionTracing($provide);
$translateProvider
.translations('en', {
'FOO': 'bar'
Expand Down Expand Up @@ -2607,6 +2669,8 @@ describe('pascalprecht.translate', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {

enableUnhandledRejectionTracing($provide);

$translateProvider.useLoader('customLoader');

$translateProvider.preferredLanguage(slowButRequestedFirst);
Expand Down Expand Up @@ -2846,6 +2910,8 @@ describe('pascalprecht.translate', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {

enableUnhandledRejectionTracing($provide);

$translateProvider.useLoader('customLoader');

$translateProvider.preferredLanguage(thePreferredLangKey);
Expand Down Expand Up @@ -2902,6 +2968,8 @@ describe('pascalprecht.translate', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {

enableUnhandledRejectionTracing($provide);

$translateProvider.useLoader('customLoader');

$translateProvider.preferredLanguage(thePreferredLangKey);
Expand Down

0 comments on commit 776993b

Please sign in to comment.