diff --git a/spec/PromiseRouter.spec.js b/spec/PromiseRouter.spec.js new file mode 100644 index 00000000..999325ac --- /dev/null +++ b/spec/PromiseRouter.spec.js @@ -0,0 +1,26 @@ +var PromiseRouter = require("../src/PromiseRouter").default; + +describe("PromiseRouter", () => { + + it("should properly handle rejects", (done) => { + var router = new PromiseRouter(); + router.route("GET", "/dummy", (req)=> { + return Promise.reject({ + error: "an error", + code: -1 + }) + }, (req) => { + fail("this should not be called"); + }); + + router.routes[0].handler({}).then((result) => { + console.error(result); + fail("this should not be called"); + done(); + }, (error)=> { + expect(error.error).toEqual("an error"); + expect(error.code).toEqual(-1); + done(); + }); + }); +}) \ No newline at end of file diff --git a/src/PromiseRouter.js b/src/PromiseRouter.js index 4070f706..308e4ded 100644 --- a/src/PromiseRouter.js +++ b/src/PromiseRouter.js @@ -49,17 +49,11 @@ export default class PromiseRouter { if (handlers.length > 1) { const length = handlers.length; handler = function(req) { - var next = function(i, req, res) { - if (i == length) { - return res; - } - let result = handlers[i](req); - if (!result || typeof result.then !== "function") { - result = Promise.resolve(result); - } - return result.then((res) => (next(i+1, req, res))); - } - return next(0, req); + return handlers.reduce((promise, handler) => { + return promise.then((result) => { + return handler(req); + }); + }, Promise.resolve()); } }