如何在Javascript中实时输出到控制台?

如何在Javascript中实时输出到控制台?,javascript,loops,for-loop,console.log,Javascript,Loops,For Loop,Console.log,在Javascript中,当您编写一段如下所示的代码时,计算机似乎会首先完成整个循环100000次(可能需要一两秒钟),然后在控制台中一次性转储所有100000行。如何使计算机每次通过循环时都能一行一行地更新控制台 为了澄清这一点,实际上,我希望能够看到计算机正在做什么,而不是在完成它之后 for(var i=1;i您的语句无效。JavaScript同步处理for循环 请检查以下问题:如果您想要更平滑的输出,我建议避免for循环,而是使用requestAnimationFrame,它将管理何时

在Javascript中,当您编写一段如下所示的代码时,计算机似乎会首先完成整个循环100000次(可能需要一两秒钟),然后在控制台中一次性转储所有100000行。如何使计算机每次通过循环时都能一行一行地更新控制台

为了澄清这一点,实际上,我希望能够看到计算机正在做什么,而不是在完成它之后


for(var i=1;i您的语句无效。JavaScript同步处理
for
循环


请检查以下问题:

如果您想要更平滑的输出,我建议避免for循环,而是使用
requestAnimationFrame
,它将管理何时打印结果

var counter = 0;
var max = 100000;
function myPrint(){
    if(counter < max){
        console.log(counter++);
        requestAnimationFrame(myPrint);
    }
}
myPrint();
var计数器=0;
var max=100000;
函数myPrint(){
如果(计数器<最大值){
console.log(counter++);
请求动画帧(myPrint);
}
}
myPrint();

用于(让i=1;i浏览器同步运行脚本。如果您希望在长任务运行时更新页面,则需要将长时间运行的同步代码拆分为多个部分,并在处理这些部分之间将控制权交给浏览器。这意味着您需要处理将一系列任务拆分为多个块的问题,然后控制g将控制权返回到浏览器的延迟

下面是一个代码片段,它提供了一种方法,允许您完全做到这一点!您会注意到性能仍然不太好,但我很确定这是由于stackoverflow的嵌入式脚本运行程序对
console.log
的实现缓慢所致。请尝试在浏览器的实际控制台中使用此代码-性能非常好

函数doHeavyTask(参数){
var totalMillisAllotted=参数totalMillisAllotted;
var totalTasks=params.totalTasks;
var tasksPerTick=params.tasksPerTick;
var tasksCompleted=0;
var totalTicks=Math.ceil(totalTasks/tasksPerTick);
var区间=null;
如果(totalTicks==0)返回;
var doTick=函数(){
var totalByEndOfTick=Math.min(tasksCompleted+tasksPerTick,totalTasks);
做{
参数任务(tasksCompleted++);
}while(任务完成=totalTasks)清除间隔(interval);
};
//立即勾选一次,然后根据需要使用setInterval勾选任意次数
多蒂克();
如果(totalTicks>1)interval=setInterval(doTick,totalMillisAllotted/totalTicks);
}
//在5秒内完成10000个console.logs,以100个为一组
重量级任务({
总毫米数:5*1000,
任务总数:10000,
tasksPerTick:100,
任务:函数(n){console.log(n+1);}

})
为了获得期望的结果,可以向一个可观察对象提供一系列承诺。承诺现在是JavaScript固有的,您可以从库中获得可观察对象

以下是一个例子:

const数组=[];
//这也可以是for of循环或.map()函数
for(设i=0;i{
//这可以是任何同步或异步代码
设置超时(()=>{
决议(i);
},1000*i);
});
array.push(promise);
}
var可观测=从(阵列)接收的可观测值;
可观察。订阅((承诺)=>{
然后(result=>console.log(result));
});

在什么环境中?Javascript在许多不同的地方运行,有许多不同的
控制台实现。日志
打开chrome开发工具,切换到控制台,将代码粘贴到中,盈利!我有一种感觉,你在一个有某种启动延迟的环境中工作。即使循环完全在e任何日志记录完成后,仅仅100000次迭代都不会花费可检测的时间…@DarkFalcon在JSFIDLE或codepen中,例如,在Chrome浏览器上运行。您发布的代码延迟是由于stackoverflow的嵌入式脚本运行环境。stackoverflow的脚本运行程序会立即调用console.log,但由于浏览器的同步特性在显示任何输出之前,它需要允许整个循环完成。这实际上与问题无关。问题更多的是,是否可以让
控制台.log
立即输出,而不是在循环完成后输出。答案是,这取决于环境例如,对于node.js,可以:@DarkFalcon console.log正在立即登录。我不会使用
requestAnimationFrame
进行任何与图形更新无关的操作。我同意,这不是最好的建议。我应该补充一点,
requestAnimationFrame
在nodeJS中不起作用。这是一种黑客行为,但我可以利用在某些情况下,试着把时间变为10ms,一些有趣的结果。在10ms,它加载速度快,结果仍然保持不变。你使用Chrome吗?是的,Chrome。在JSfiddle尝试,它不会按顺序打印出来。抱歉,如何在慢模式下这样做?慢模式我指的是每3-5秒只有1个任务。因为我试图改变那些PAR。ameters,但我总是以错误告终。也许你可以启发我。在5秒钟的延迟时间内,你需要先知道你想要完成多少任务;假设你想要100。然后将
totalTasks
设置为100,将
tasksPerTick
设置为1,并将
totalMillisAllotted
设置为
100*5000
(每个任务5秒)。