Hacker News new | ask | show | jobs
by embwbam 4884 days ago
At least in node, you usually pass errors all the way back up the call chain. With normal callback style error handling, you have to put "if (err) return cb(err)" after each async call. It's crazy.

With promises, you can attach an error handler once. If you think of errors as only unexpected conditions, you can have a single error handler for each set of operations and not have to worry about checking at each step.

2 comments

> With normal callback style error handling, you have to put "if (err) return cb(err)" after each async call. It's crazy.

Or use a sane async library. As far as I can tell, something like https://github.com/caolan/async gives you a strict superset of Promise features, unless you're for some reason tied to how code with promises looks.

You can wrap your callback functions and handle errors all in one spot. Example:

    var slice = Array.prototype.slice;

    function errHandler(callback) {
      return function(err) {
        if(err) {
      // Error handling code here.
        } else {
          callback(slice.call(arguments, 1));
        }
      };
    }
I've tried stuff like this before, but it clutters your code pretty bad anyway, doesn't it? You have to do something like this:

    function myAsyncThing(cb) {
        var handleErrors = errHandler(cb)
        doSomethingElse(handleErrors(function(data) {
            // repeat. use handleErrors at each callback. 
        }))
    }
    
Am I missing something? Can you get it cleaner than that?
That depends, if you're using doSomethingElse a lot I'd just go ahead and wrap that as well, if you're using it once it's no big deal.

  doSomethingElse(errHandler(function(real, results) {
    // foo
  }));
  
If you're using Node you should be writing small(ish) modules anyways, so it doesn't lead to much code blote and its advantageous to consolidate your error handling in one or 2 spots.