From f6ede306b2b4914b10ad3a9bc506c8154b07f775 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 2 May 2016 18:04:26 -0400 Subject: [PATCH] Use overridable Unhanded Rejection Handler --- promise.js | 10 +++++++--- test/adapter.js | 20 ++------------------ test/promise.js | 32 +++++++++++++------------------- test/promises-spec.js | 19 +++++++++++++++++-- 4 files changed, 39 insertions(+), 42 deletions(-) diff --git a/promise.js b/promise.js index e4ed3b9..4d61182 100644 --- a/promise.js +++ b/promise.js @@ -178,8 +178,8 @@ /** * An internal use static function. */ - Promise._onPossiblyUnhandledRejection = function(reason, promise) { - throw reason; + Promise._overrideUnhandledExceptionHandler = function(handler) { + onPossiblyUnhandledRejection = handler; }; /**************************** @@ -317,7 +317,7 @@ if (state === RejectedPromise && promise._isChainEnd) { setTimeout(function() { if (promise._isChainEnd) { - promise.constructor._onPossiblyUnhandledRejection(value, promise); + onPossiblyUnhandledRejection(value, promise); } }, 0); } @@ -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. diff --git a/test/adapter.js b/test/adapter.js index db54426..b544695 100644 --- a/test/adapter.js +++ b/test/adapter.js @@ -1,4 +1,3 @@ -'use strict'; var Promise = require('../'); var Adaptor = function() { @@ -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; diff --git a/test/promise.js b/test/promise.js index 52e9f21..c452c15 100644 --- a/test/promise.js +++ b/test/promise.js @@ -1,5 +1,5 @@ -"use strict"; -var Promise = require('../'); +var Promise = require('./adapter'); + var chai = require('chai'); var sinon = require('sinon'); var expect = chai.expect; @@ -7,11 +7,10 @@ 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() { @@ -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(); }); }); @@ -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(); }); @@ -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() {}); }); @@ -126,7 +120,7 @@ describe('PJs', function() { }).catch(function() {}); return new Promise(function(resolve, reject) { - Promise._onPossiblyUnhandledRejection = resolve; + Promise._overrideUnhandledExceptionHandler(resolve); resolveP(); }); }); @@ -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() { @@ -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(); }); @@ -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() {}); }); diff --git a/test/promises-spec.js b/test/promises-spec.js index 4289303..469beb3 100644 --- a/test/promises-spec.js +++ b/test/promises-spec.js @@ -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; + } +});