Skip to content

Instantly share code, notes, and snippets.

@slikts
Last active June 8, 2016 17:53
Show Gist options
  • Save slikts/00adaba1874d369464454a851c8c0bf8 to your computer and use it in GitHub Desktop.
Save slikts/00adaba1874d369464454a851c8c0bf8 to your computer and use it in GitHub Desktop.
Rate-limited concurrent promises using an iterator
class Deferred extends Promise {
constructor() {
let resolve, reject
super((...args) => [resolve, reject] = args)
Object.assign(this, {resolve, reject})
}
}
Deferred.tasks = (list, limit = list.length) => {
const promises = list.map(task => {
function exec(iterator) {
task()
.then(this.resolve, this.reject)
.then(() => {
const {value} = iterator.next()
if (value) value.exec(iterator)
})
}
return Object.assign(new Deferred(), {exec})
})
const iterator = promises[Symbol.iterator]()
Array.from(Array(limit), () => iterator.next().value.exec(iterator))
return Promise.all(promises)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment