Skip to content

Commit c99d1a0

Browse files
committed
Chained promises should be marked as handled. Fixes #10
1 parent e675603 commit c99d1a0

File tree

3 files changed

+72
-18
lines changed

3 files changed

+72
-18
lines changed

index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ Promise.prototype = {
197197
rejected: onRejection
198198
};
199199

200-
if (onRejection && !this._handled) {
200+
if ((onRejection || onFulfillment) && !this._handled) {
201201
this._handled = true;
202202
if (this._state === REJECTED && isNode) {
203203
asyncCall(notifyRejectionHandled, this);

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"es6"
2727
],
2828
"devDependencies": {
29+
"core-assert": "^0.1.1",
2930
"coveralls": "^2.11.4",
3031
"mocha": "*",
3132
"nyc": "^3.2.2",

test.js

Lines changed: 70 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
'use strict';
44

5-
var assert = require('assert');
5+
var assert = require('core-assert');
66
var Promise = require('./');
77

88
describe('Promise', function () {
@@ -189,7 +189,7 @@ describe('unhandledRejection/rejectionHandled events', function () {
189189

190190
it('should not emit any events if handled before the next turn', function (done) {
191191
var promise = Promise.reject(new Error('handled immediately after rejection'));
192-
promise.catch(function () {});
192+
promise.catch(noop);
193193
nextLoop(function () {
194194
assert.deepEqual(events, []);
195195
done();
@@ -199,7 +199,7 @@ describe('unhandledRejection/rejectionHandled events', function () {
199199
it('should emit a rejectionHandled event if handledLater', function (done) {
200200
var promise = Promise.reject(new Error('eventually handled'));
201201
nextLoop(function () {
202-
promise.catch(function () {});
202+
promise.catch(noop);
203203
nextLoop(function () {
204204
assert.deepEqual(events, [
205205
['unhandledRejection', ['eventually handled', promise]],
@@ -210,27 +210,80 @@ describe('unhandledRejection/rejectionHandled events', function () {
210210
});
211211
});
212212

213+
it('should not emit any events when handled by a chained promise', function (done) {
214+
var promise = Promise.reject(new Error('chained'));
215+
promise
216+
.then(noop)
217+
.then(noop)
218+
.then(noop)
219+
.catch(noop);
220+
later(function () {
221+
assert.deepStrictEqual(events, []);
222+
done();
223+
});
224+
});
225+
226+
it('catch() should only emit rejectionHandled one branch of a forked promise chain at a time', function (done) {
227+
var def = deferred();
228+
var root = def.promise;
229+
230+
// build the first branch
231+
root.then(noop).then(noop).catch(noop);
232+
233+
// build the second branch
234+
var b1 = root.then(noop).then(noop);
235+
236+
def.reject(new Error('branching'));
237+
238+
var c;
239+
240+
later(step1);
241+
242+
function step1() {
243+
b1.catch(noop);
244+
c = root.then(noop);
245+
later(step2);
246+
}
247+
248+
function step2() {
249+
assert.deepStrictEqual(events, [
250+
['unhandledRejection', ['branching', b1]],
251+
['rejectionHandled', [b1]],
252+
['unhandledRejection', ['branching', c]]
253+
]);
254+
done();
255+
}
256+
});
257+
258+
function noop() {}
259+
213260
function nextLoop(fn) {
214261
setImmediate(fn);
215262
}
263+
264+
function later(fn) {
265+
setTimeout(fn, 40);
266+
}
216267
});
217268

269+
function deferred() {
270+
var resolve;
271+
var reject;
272+
var promise = new Promise(function (res, rej) {
273+
resolve = res;
274+
reject = rej;
275+
});
276+
277+
return {
278+
promise: promise,
279+
resolve: resolve,
280+
reject: reject
281+
};
282+
}
283+
218284
describe('Promises/A+ Tests', function () {
219285
var adapter = {
220-
deferred: function () {
221-
var resolve;
222-
var reject;
223-
var promise = new Promise(function (res, rej) {
224-
resolve = res;
225-
reject = rej;
226-
});
227-
228-
return {
229-
promise: promise,
230-
resolve: resolve,
231-
reject: reject
232-
};
233-
}
286+
deferred: deferred
234287
};
235288

236289
require('promises-aplus-tests').mocha(adapter);

0 commit comments

Comments
 (0)