diff options
| -rw-r--r-- | lib/promises.js | 7 | ||||
| -rw-r--r-- | test/.eslintrc.json | 3 | ||||
| -rw-r--r-- | test/promises.tests.js | 94 |
3 files changed, 102 insertions, 2 deletions
diff --git a/lib/promises.js b/lib/promises.js index f448ca9..f008200 100644 --- a/lib/promises.js +++ b/lib/promises.js @@ -2,9 +2,14 @@ var _ = require("underscore"); var bluebird = require("bluebird/js/release/promise")(); exports.defer = defer; +exports.Promise = bluebird.Promise; exports.resolve = bluebird.resolve; exports.reject = bluebird.reject; -exports.forEachSeries = bluebird.mapSeries; + +exports.forEachSeries = function(array, func) { + return bluebird.mapSeries(array, func).then(function() { + }); +}; var props = exports.props = function(obj) { // We rely on .keys() and .values() returning properties in the same order. diff --git a/test/.eslintrc.json b/test/.eslintrc.json index 4869f03..5bbc8fa 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -2,6 +2,7 @@ "globals": { "__dirname": false, "describe": false, - "it": false + "it": false, + "setTimeout": false } } diff --git a/test/promises.tests.js b/test/promises.tests.js index a6e35ac..6497cd3 100644 --- a/test/promises.tests.js +++ b/test/promises.tests.js @@ -3,6 +3,100 @@ var assert = require("assert"); var promises = require("../lib/promises"); var test = require("./test")(module); +test("forEachSeries", { + "empty array resolves immediately without calling function": function() { + return promises.forEachSeries([], function() { + throw new Error(); + }).then(function(result) { + assert.deepStrictEqual(result, undefined); + }); + }, + + "function is called on element after the previous element has been processed": function() { + var log = []; + + return promises.forEachSeries([1, 2, 3], function(element) { + return new promises.Promise(function(resolve) { + log.push(["start", element]); + setTimeout(function() { + log.push(["end", element]); + resolve(); + }, 0); + }); + }).then(function(result) { + assert.deepStrictEqual(result, undefined); + assert.deepStrictEqual(log, [ + ["start", 1], + ["end", 1], + ["start", 2], + ["end", 2], + ["start", 3], + ["end", 3] + ]); + }); + }, + + "processing stops on sync error": function() { + var log = []; + + return promises.forEachSeries([1, 2, 3], function(element) { + return new promises.Promise(function(resolve) { + log.push(["start", element]); + if (element === 2) { + throw new Error("failure"); + } else { + setTimeout(function() { + log.push(["end", element]); + resolve(); + }, 0); + } + }); + }).then( + function() { + assert.fail("Expected rejection"); + }, + function(error) { + assert.strictEqual(error.message, "failure"); + assert.deepStrictEqual(log, [ + ["start", 1], + ["end", 1], + ["start", 2] + ]); + } + ); + }, + + "processing stops on async error": function() { + var log = []; + + return promises.forEachSeries([1, 2, 3], function(element) { + return new promises.Promise(function(resolve, reject) { + log.push(["start", element]); + setTimeout(function() { + if (element === 2) { + reject(new Error("failure")); + } else { + log.push(["end", element]); + resolve(); + } + }, 0); + }); + }).then( + function() { + assert.fail("Expected rejection"); + }, + function(error) { + assert.strictEqual(error.message, "failure"); + assert.deepStrictEqual(log, [ + ["start", 1], + ["end", 1], + ["start", 2] + ]); + } + ); + } +}); + test("try", { "when function succeeds with non-promise then promise is resolved": function() { return promises.try(function() { |
