Skip to content

Commit

Permalink
Use overridable Unhanded Rejection Handler
Browse files Browse the repository at this point in the history
  • Loading branch information
jridgewell committed May 2, 2016
1 parent bf8d503 commit f6ede30
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 42 deletions.
10 changes: 7 additions & 3 deletions promise.js
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,8 @@
/**
* An internal use static function.
*/
Promise._onPossiblyUnhandledRejection = function(reason, promise) {
throw reason;
Promise._overrideUnhandledExceptionHandler = function(handler) {
onPossiblyUnhandledRejection = handler;
};

/****************************
Expand Down Expand Up @@ -317,7 +317,7 @@
if (state === RejectedPromise && promise._isChainEnd) {
setTimeout(function() {
if (promise._isChainEnd) {
promise.constructor._onPossiblyUnhandledRejection(value, promise);
onPossiblyUnhandledRejection(value, promise);
}
}, 0);
}
Expand Down Expand Up @@ -360,6 +360,10 @@
return obj === Object(obj);
}

var onPossiblyUnhandledRejection = function(reason, promise) {
throw reason;
};

/**
* Iterates over each element of an array, calling the iterator with the
* element and its index.
Expand Down
20 changes: 2 additions & 18 deletions test/adapter.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
'use strict';
var Promise = require('../');

var Adaptor = function() {
Expand All @@ -11,21 +10,6 @@ for (var prop in Promise) {
Adaptor[prop] = Promise[prop];
}
}
Adaptor._onPossiblyUnhandledRejection = function() {};
Adaptor._overrideUnhandledExceptionHandler(function() {});

module.exports = {
resolved: function(value) {
return Adaptor.resolve(value);
},
rejected: function(reason) {
return Adaptor.reject(reason);
},
deferred: function() {
var deferred = {};
deferred.promise = new Adaptor(function(resolve, reject) {
deferred.resolve = resolve;
deferred.reject = reject;
});
return deferred;
}
};
module.exports = Adaptor;
32 changes: 13 additions & 19 deletions test/promise.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
"use strict";
var Promise = require('../');
var Promise = require('./adapter');

var chai = require('chai');
var sinon = require('sinon');
var expect = chai.expect;

chai.use(require('sinon-chai'));

describe('PJs', function() {
var _onPossiblyUnhandledRejection = Promise._onPossiblyUnhandledRejection;
var noop = function() {};

beforeEach(function() {
Promise._onPossiblyUnhandledRejection = noop;
Promise._overrideUnhandledExceptionHandler(noop);
});

describe('constructor', function() {
Expand Down Expand Up @@ -76,20 +75,15 @@ describe('PJs', function() {
});
});

describe('._onPossiblyUnhandledRejection', function() {
describe('._overrideUnhandledExceptionHandler', function() {
var Promise;
beforeEach(function() {
Promise._onPossiblyUnhandledRejection = _onPossiblyUnhandledRejection;
});

it('throws the rejection reason', function() {
expect(function() {
Promise._onPossiblyUnhandledRejection('what reason?');
}).to.throw('what reason');
Promise = require('./adapter');
});

it('is called when a rejected promise does not have a onRejected', function() {
return new Promise(function(resolve) {
Promise._onPossiblyUnhandledRejection = resolve;
Promise._overrideUnhandledExceptionHandler(resolve);
Promise.reject();
});
});
Expand All @@ -101,7 +95,7 @@ describe('PJs', function() {
}).catch(function() {});

return new Promise(function(resolve, reject) {
Promise._onPossiblyUnhandledRejection = reject;
Promise._overrideUnhandledExceptionHandler(reject);
setTimeout(resolve, 100);
rejectP();
});
Expand All @@ -110,7 +104,7 @@ describe('PJs', function() {
it('is not called when a rejected promise gets a onRejected', function() {
var p = Promise.reject();
return new Promise(function(resolve, reject) {
Promise._onPossiblyUnhandledRejection = reject;
Promise._overrideUnhandledExceptionHandler(reject);
setTimeout(resolve, 100);
p.catch(function() {});
});
Expand All @@ -126,7 +120,7 @@ describe('PJs', function() {
}).catch(function() {});

return new Promise(function(resolve, reject) {
Promise._onPossiblyUnhandledRejection = resolve;
Promise._overrideUnhandledExceptionHandler(resolve);
resolveP();
});
});
Expand All @@ -135,7 +129,7 @@ describe('PJs', function() {
describe('when rejection happens in the middle of a chain', function() {
it('is called when the end promise does not have a onRejected', function() {
return new Promise(function(resolve) {
Promise._onPossiblyUnhandledRejection = resolve;
Promise._overrideUnhandledExceptionHandler(resolve);
Promise.resolve().then(function() {
throw 1;
}).then(function() {
Expand All @@ -155,7 +149,7 @@ describe('PJs', function() {
}).catch(function() {});

return new Promise(function(resolve, reject) {
Promise._onPossiblyUnhandledRejection = reject;
Promise._overrideUnhandledExceptionHandler(reject);
setTimeout(resolve, 100);
resolveP();
});
Expand All @@ -169,7 +163,7 @@ describe('PJs', function() {
});

return new Promise(function(resolve, reject) {
Promise._onPossiblyUnhandledRejection = reject;
Promise._overrideUnhandledExceptionHandler(reject);
setTimeout(resolve, 100);
p.catch(function() {});
});
Expand Down
19 changes: 17 additions & 2 deletions test/promises-spec.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,19 @@
var tests = require('promises-aplus-tests');
var adapter = require('./adapter');
var Adaptor = require('./adapter');

tests.mocha(adapter);
tests.mocha({
resolved: function(value) {
return Adaptor.resolve(value);
},
rejected: function(reason) {
return Adaptor.reject(reason);
},
deferred: function() {
var deferred = {};
deferred.promise = new Adaptor(function(resolve, reject) {
deferred.resolve = resolve;
deferred.reject = reject;
});
return deferred;
}
});

0 comments on commit f6ede30

Please sign in to comment.