Skip to content

Instantly share code, notes, and snippets.

@Restuta
Last active May 5, 2017 22:21
Show Gist options
  • Save Restuta/d282b511097f7e9237a1e642b7e539c5 to your computer and use it in GitHub Desktop.
Save Restuta/d282b511097f7e9237a1e642b7e539c5 to your computer and use it in GitHub Desktop.
Simple Progress Reporter for JavaScript
// gets time now in milliseconds
const msNow = () => (+new Date())
function createProgress ({
maxItems = 100,
onProgressChange = () => {},
onComplete = () => {}
}) {
let currentProgress = 0 // %
let lastProgress = 0
const startTimeInMs = msNow()
let msPassedFromLastProggress = 0
let lastProgressStartedAt = msNow()
return {
report (count) {
currentProgress = (count / maxItems) * 100
const progressChangedSignificantly = Math.floor(currentProgress) > Math.floor(lastProgress)
if (progressChangedSignificantly) {
msPassedFromLastProggress = (msNow() - lastProgressStartedAt)
lastProgressStartedAt = msNow()
onProgressChange({
progress: Math.floor(currentProgress) + '%',
msPassed: msPassedFromLastProggress + 'ms'
})
const finalProgressReport = currentProgress === 100
if (finalProgressReport) {
const totalTimeTakenMs = msNow() - startTimeInMs
onComplete({
totalTimeTakenMs: totalTimeTakenMs
})
}
}
lastProgress = currentProgress
}
}
}
module.exports = createProgress
/* USAGE EXAMPLE
const progress = createProgress({
maxItems: 1000,
onProgressChange: ({progress, msPassed}) => console.info(`${progress} in ${msPassed}`),
onComplete: ({ totalTimeTakenMs }) => console.info(chalk.blue(`Total time taken: ${totalTimeTakenMs}ms`))
})
progress.report(currentItemNumber) //e.g. 420 would cause it to output 42%
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment