chan
Version:
A go style channel implementation that works nicely with co
64 lines (58 loc) • 1.08 kB
JavaScript
/**
* Expose `Receiver`.
*/
module.exports = Receiver
/**
* Initialize a `Receiver`.
*
* @param {Mixed} val
* @api private
*/
function Receiver(val) {
this.val = val
this.isAdded = false
this.err = null
this.cb = null
this.isDone = false
}
/**
* Call the callback if the pending add is complete.
*
* @api private
*/
Receiver.prototype.attemptNotify = function () {
if ((this.isAdded || this.err) && this.cb && !this.isDone) {
this.isDone = true
setImmediate(function () { this.cb(this.err) }.bind(this))
}
}
/**
* Reject the pending add with an error.
*
* @param {Error} err
* @api private
*/
Receiver.prototype.error = function (err) {
this.err = err
this.attemptNotify()
}
/**
* Get the `val` and set the state of the value to added
*
* @return {Mixed} val
* @api private
*/
Receiver.prototype.add = function () {
this.isAdded = true
this.attemptNotify()
return this.val
}
/**
* Register the callback.
*
* @api private
*/
Receiver.prototype.callback = function (cb) {
this.cb = cb
this.attemptNotify()
}