Estoy tratando de actualizar las líneas de registro de la consola cuando uso readline y process.stdout de nodejs en lugar de volver a imprimir los registros repetidamente.
const readline = require('readline') let firstLog = true; /** * BEGIN Helper Functions */ function randomIntFromInterval(min, max) { // min and max included return Math.floor(Math.random() * (max - min + 1) + min) } function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)) } function concurrency(array, map, limit) { let arr = [...array] let pendingCount = 0 const results = [] return new Promise((resolve, reject) => { function pump() { while (arr && arr.length && pendingCount < limit) { pendingCount++ map(arr.shift(), pendingCount).then( (result) => { pendingCount-- results.push(result) pump() }, (err) => { arr = null reject(err) }, ) } if (!pendingCount) { return resolve(results) } } pump() }) } /** * END Helper Functions */ const data = []; /** * Seed test data */ for (let i = 0; i < 10; i++) { const item = { name: i.toString(), status: 'initialized' }; data.push(item) log(item) } /** * Process all items concurrently * @param {*} item */ function main() { concurrency(data, async (item ,i) => { await updateStatusAsync(item) log(item, i) }, 3) } /** * Update status while simulating long running task * @param {*} repo */ async function updateStatusAsync(item) { await sleep(randomIntFromInterval(3, 5) * 1000) item.status = "completed" } function log(item, i) { if (i > 0 && firstLog) { i-- readline.moveCursor(process.stdout, 0, -(data.length - i)) readline.cursorTo(process.stdout, 0) firstLog = false } readline.clearLine(process.stdout) process.stdout.write(`${item.name}: ${item.status}\n`) } main() El código anterior registrará todos los elementos en una matriz y luego, a intervalos aleatorios, cada campo de status se actualizará para reflejar un nuevo valor.
Inicialmente, todos están en estado initialized :
0: initialized 1: initialized 2: initialized 3: initialized 4: initialized ... Luego se actualizará a intervalos aleatorios hasta completed .
¿Cómo puedo actualizar cada elemento de línea "in situ" en lugar de tener que volver a imprimirlos todos cada vez que se actualiza un elemento?