diff --git a/lib/index.js b/lib/index.js index 21c025a..9a6803b 100644 --- a/lib/index.js +++ b/lib/index.js @@ -44,10 +44,10 @@ ChainGang.prototype.shift = function() { }; } }; -ChainGang.prototype.finish = function(name) { +ChainGang.prototype.finish = function(name, err) { delete this.index[name]; - this.emit(name); - return this.emit('finished', name); + this.emit(name, err); + return this.emit('finished', name, err); }; ChainGang.prototype.emit = function(event) { var args; @@ -101,13 +101,13 @@ Worker.prototype.perform = function() { try { return data.callback(this); } catch (err) { - sys.puts(sys.inspect(err)); - this.chain.emit('error', err, data.name); - return finish(data.name); + this.chain.emit(("error-" + data.name), err); + this.chain.emit("error", err, data.name); + return this.finish(data.name, err); } }; -Worker.prototype.finish = function() { - this.chain.finish(this.performing); +Worker.prototype.finish = function(err) { + this.chain.finish(this.performing, err); this.performing = false; return this.perform(); }; diff --git a/src/index.coffee b/src/index.coffee index b50bba8..e946564 100644 --- a/src/index.coffee +++ b/src/index.coffee @@ -31,12 +31,14 @@ class ChainGang # Emits ('add', name) add: (task, name, callback) -> name: or @default_name_for task + if callback then @events.addListener name, callback if @index[name] != undefined then return @queue.push name @index[name]: task @events.emit 'add', name + if @active then @perform() # Public: Attempts to find an idle worker to perform a job. @@ -63,12 +65,12 @@ class ChainGang # name - The unique String job identifier. # # Returns nothing. - # Emits (name) - # Emits ('finished', name) - finish: (name) -> + # Emits (name, err) + # Emits ('finished', name, err) + finish: (name, err) -> delete @index[name] - @emit name - @emit 'finished', name + @emit name, err + @emit 'finished', name, err emit: (event, args...) -> @events.emit event, args... @@ -118,15 +120,15 @@ class Worker try data.callback this catch err - sys.puts sys.inspect(err) - @chain.emit 'error', err, data.name - finish data.name + @chain.emit "error-$data.name", err + @chain.emit "error", err, data.name + @finish data.name, err # Finishes the current job, and looks for another. # # Returns nothing. - finish: -> - @chain.finish @performing + finish: (err) -> + @chain.finish @performing, err @performing: false @perform() diff --git a/test/error_test.coffee b/test/error_test.coffee new file mode 100644 index 0000000..8884eb6 --- /dev/null +++ b/test/error_test.coffee @@ -0,0 +1,39 @@ +sys: require('sys') +assert: require('assert') +chainGang: require('../src') + +chain: chainGang.create({workers: 2}) +assert.equal(2, chain.workers.length) + +called_finished: false +called_named: false +called_error: false +called_custom_error: false + +chain.addListener 'finished', (name, err) -> + assert.ok err + assert.equal 'foo', name + called_finished: true + +chain.addListener 'foo', (err) -> + assert.ok err + called_named: true + +chain.addListener 'error', (err, name) -> + assert.ok err + assert.equal 'foo', name + called_error: true + +chain.addListener 'error-foo', (err) -> + assert.ok err + called_custom_error: true + +chain.add -> + a.b == c +, 'foo' + +process.addListener 'exit', -> + assert.ok called_error + assert.ok called_custom_error + assert.ok called_finished + assert.ok called_named \ No newline at end of file