function findRoutingFor(method, path) {
var foundRoute, routeArgs;
// some computation here
if (foundRoute)
return [foundRoute, routeArgs];
}
// and at call site
var rv = findRoutingFor(method, path);
if (!rv)
throw new Error(/* */);
var foundRoute = rv[0];
var routeArgs = rv[1];
I believe, that I came up with more elegant way to do that. Continuation passing style saves us here. Here's how:
// notice extra parameter
function findRoutingFor(method, path, body) {
var foundRoute, routeArgs;
// same computation here
// and then we invoke continuation
return body(foundRoute, routeArgs);
}
// then at call site...
return findRoutingFor(method, path, function (foundRoute, routeArgs) {
if (!foundRoute)
throw new Error(/* */);
// rest of call site is here
});
So continuation passing style allows us to avoid packing & unpacking of multiple return values. There are some costs, like, for example, extra indentation of rest of call site, but, IMO, in many cases it's better than usual alternative.