JacksonTian/eventproxy — pull request #8 by fengmk2 (2012-11-14 06:05:10+00:00)
Title: add errorHandler mode

## 统一处理error返回

这是来自我们实践代码总结，通过 `error` 事件统一处理所有异步请求的异常。

```js
var eventproxy = require('eventproxy');

exports.getTweet = function (userId, tweetId, callback) {
// eventproxy.create(events, handler, errorHandler);
var ep = eventproxy.create('user', 'tweet', 'retweets', 'friends', 'messages',
function (user, tweet, retweets, friends, messages) {
user.friends = friends;
user.messages = messages;
tweet.user = user;
tweet.retweets = retweets;
callback(null, tweet);
}, function (err) {
callback(err);
});

// or you can use `ep.fail(errorHandler)` to listen 'error' event.

twitter.get(tweetId, ep.done('tweet'));
twitter.getRetweets(tweetId, ep.done('retweets'));
twitter.getUser(userId, ep.done(function (user) {
ep.emit('user', user);
twitter.getUserFriends(user.id, ep.done('friends'));
}));
twitter.getUserMessages(userId, ep.done('message'));
};
```

在没使用上述方法前，我们会这样写代码:

```js
var eventproxy = require('eventproxy');

exports.getTweet = function (userId, tweetId, callback) {
// eventproxy.create(events, handler);
var ep = eventproxy.create('user', 'tweet', 'retweets', 'friends', 'messages',
function (user, tweet, retweets, friends, messages) {
user.friends = friends;
user.messages = messages;
tweet.user = user;
tweet.retweets = retweets;
callback(null, tweet);
});

ep.once('error', function (err) {
ep.unbind();
callback(err);
});

twitter.get(tweetId, function (err, tweet) {
if (err) {
return ep.emit('error', err);
}
ep.emit('tweet', tweet);
});
twitter.getRetweets(tweetId, function (err, retweets) {
if (err) {
return ep.emit('error', err);
}
ep.emit('retweets', retweets);
});
twitter.getUser(userId, function (err, user) {
if (err) {
return ep.emit('error', err);
}
ep.emit('user', user);
twitter.getUserFriends(user.id, function (err, friends) {
if (err) {
return ep.emit('error', err);
}
ep.emit('friends', friends);
});
});
twitter.getUserMessages(userId, function (err, messages) {
if (err) {
return ep.emit('error', err);
}
ep.emit('messages', messages);
});
};
```