[英]Pause console output using Node.js
我正在尝试仅使用控制台而不是在网页上创建时间显示 (h:mm:ss)。 最初应设置时间,然后在更改时显示时间。
当使用输出控制台(在 Web 浏览器中)或在 vscode 中时,js 或 node.js 是否有可能在打印数千/多个输出时在控制台中打印的每个输出之间存在延迟而不使用扩展?
下面是每 1 秒将当前时间打印到控制台的示例:
// setInterval() executes the given function on a given time interval setInterval(() => { console.log(new Date().toTimeString()); // function to execute }, 1000) // execute every 1000 ms
您还可以打印自己的计数器:
let secondsElapsed = 0 setInterval(() => { console.log(`seconds elapsed = ${secondsElapsed}`); secondsElapsed++; }, 1000)
以下是如何完成您似乎要求的内容:
const clockTick = (callback) => { const tick = () => { const now = Date.now(); callback(now); setTimeout(tick, 1000 - (now % 1000)); } tick(); } clockTick(timestamp => { const date = new Date(timestamp); const hours = date.getHours(); const minutes = date.getMinutes(); const seconds = date.getSeconds(); console.log(`${hours}:${minutes}:${seconds}`); });
接受的答案不正确。 IMO,我们应该实现一个队列或类似的东西,以实现“每个输出之间的延迟”。 我觉得这个问题很有趣,所以我为了一些乐趣而实现了这段代码(使用承诺链作为一个简单的队列):
const callNext = (function () {
let queueChain = Promise.resolve();
// Called after previous command (1 second by default)
function callNext(func, delay = 1000) {
queueChain = queueChain.then(() => {
return new Promise((res) => {
setTimeout(() => {
func();
res();
}, delay);
});
});
}
return callNext;
})();
callNext(() => {
console.log('run after 3s')
}, 3000);
callNext(() => {
console.log('run after the above 3s')
}, 3000);
callNext(() => {
console.log('run after the above 1s by default')
});
我们可以使用上面的callNext
创建一个简单的记录器以获得更清晰的语法:
const logger = (function () {
function createLogFn(name) {
return function (...args) {
let delay = 1000;
// take the last argument as "delay" param
if (typeof args[args.length -1] === 'number') {
delay = args.pop();
}
callNext(() => {
console[name](`${name.toUpperCase()} [${(new Date().toISOString())}]: `, ...args);
}, delay);
};
}
const logger = {
log: createLogFn('log'),
info: createLogFn('info'),
debug: createLogFn('debug'),
error: createLogFn('error'),
}
return logger;
})();
logger.log('run after 3s', 3000);
logger.log('run after the above 3s', 3000);
logger.log('run after the above 1s');
logger.info('final run after the above 2s', 2000);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.