question about this `if (error) return;` approach. Are we still incrementing `completed` appropriately? For some reason I get the feeling that in an actual error case, we might not ever end up hitting the `cb(error, touchStateObjects)` line above, resulting in a hang.

what about a different approach, where any error is passed to `action()`, which then looks a bit like:

```js
var isReturned = false;
var action = function (err) {
  if (err && !isReturned) {
    isReturned = true;
    return cb(err);
  } else if (err) {
    return; // don't bother executing the rest since we already responded
  }
  ...
};
```

Since `action()` is ultimately the thing which is going to be responding with the main `cb`, it might be simpler if it's the only thing that has to know about error states and whether it needs to return.