diff --git a/test/promise-test.js b/test/promise-test.js index 28f5c985..ee151b35 100644 --- a/test/promise-test.js +++ b/test/promise-test.js @@ -660,6 +660,38 @@ define('when/promise-test', function (require) { } }, + 'both': { + 'should return a promise': function () { + assert.isFunction(defer().promise.both().then); + }, + + 'should register callback as callback': function (done) { + var d = when.defer(); + + d.promise.both( + function(err, val) { + assert.equals(val, 1); + done(); + } + ); + + d.resolve(1); + }, + + 'should register callback as errback': function (done) { + var d = when.defer(); + + d.promise.both( + function(err) { + assert.equals(err, 1); + done(); + } + ); + + d.reject(1); + } + }, + 'yield': { 'should return a promise': function() { assert.isFunction(defer().promise.yield().then); diff --git a/when.js b/when.js index b543fb57..82dd84db 100644 --- a/when.js +++ b/when.js @@ -95,6 +95,21 @@ define(function () { } }, + /** + * Calls combinedCallback with (reason, value) on either fulfillment or + * rejection. + * @param {function} combinedCallback handler to be called on either + * fulfillment or rejection. + * @return {Promise} + */ + both: function (combinedCallback) { + return this.then(success, combinedCallback); + + function success(value) { + return combinedCallback(null, value); + } + }, + /** * Shortcut for .then(function() { return value; }) * @param {*} value