; | |
var RingBuffer = require('./ring_buffer'); | |
var Pledge = function() { | |
this._complete = false; | |
this._callbacks = new RingBuffer(Pledge.QUEUE_SIZE); | |
}; | |
Pledge.QUEUE_SIZE = 4; | |
Pledge.all = function(list) { | |
var pledge = new Pledge(), | |
pending = list.length, | |
n = pending; | |
if (pending === 0) pledge.done(); | |
while (n--) list[n].then(function() { | |
pending -= 1; | |
if (pending === 0) pledge.done(); | |
}); | |
return pledge; | |
}; | |
Pledge.prototype.then = function(callback) { | |
if (this._complete) callback(); | |
else this._callbacks.push(callback); | |
}; | |
Pledge.prototype.done = function() { | |
this._complete = true; | |
var callbacks = this._callbacks, callback; | |
while (callback = callbacks.shift()) callback(); | |
}; | |
module.exports = Pledge; | |